Eliminar dato en Prolog
Hola, ojala alguien me pueda ayudar, tengo que hacer un programa k elimine un dato preguntando al programa de esta manera ?elimina([a,b,c,d,e],2,x)
la constante es el que dice que dato va a eliminar en este caso el num. 2 va a eliminar a b y el resultado es
x=[a,c,d,e] yo por mi parte ya lo he intentado hacer pero algo tengo mal, ojala que alguien se tome un poco de su tiempo para ayudarme, gracias!!!
la constante es el que dice que dato va a eliminar en este caso el num. 2 va a eliminar a b y el resultado es
x=[a,c,d,e] yo por mi parte ya lo he intentado hacer pero algo tengo mal, ojala que alguien se tome un poco de su tiempo para ayudarme, gracias!!!
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.
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.