
Otto87
05 de Junio del 2009
|
mmm pues seria algo asi
elimina(L,N):-
eliminaAux(L,N,[],X,1).
write(X).
eliminaAux([],N,L2,L2,C).
eliminaAux([Cab|Col],N,L2,X,C):-
=:=(C,N)
is(C2,+(C,1)),
eliminarAux(Col,N,L2,X,C).
eliminaAux([Cab|Col],N,L2,X,C):-
==(C,N),
is(C1,+(C,1)),
eliminarAux()
is(C1,+(C,1)),
eliminarAux(Col,N,[Cab|L2],X,C1).
medio te explico vos haces la consulta ?elimina([a,b,c,d],2,X).
la primera clausula llama a elimnarAux q tiene como argumentos
L - es la lista q mandas
N- es la posicion del elemento q queres eliminar
L2- es una lista vacia donde vamos a crear la nueva lista sin el elemento que querias
X- es donde vamos a guardar la lista final.
C- es un contador inicializado en 1 para ver en q posicion vamos
la segunda clausula es la condicion de paro de la recursion, basicamente te dice q cuando la lista este vacia, q copie L2 y lo meta en X. (haces esto por q cuando la recursion acaba L2 sera destruida).
la tercera clausula es donde sacas el termino q no queres
osea q C el contador sea igual a N la posicion que queres eliminar, separa L en cabeza y cola, y cuando hace la recursion mandas SOLO la cola dejando la cabeza fuera q era el termino q no querias
en la cuarta simplemente te dice q mientras el contador no sea iigual la posicion deseada , q le aunmente 1 al contador y mande la cola a segir caminando y meta la cabeza a la lista vacia.
EL unico inconviente es q la lista viene al revez, por ejemplo tu querias eliminar B, esto te va a devolver [D,C,A
pero solo aplicas un REVERSE a X al final de todo y te lo da normal.
|