Insisto. Please Ayudenme con este codigo prolog es simple!!!

Mar25
12 de Agosto del 2009
Implement茅 este c贸digo, lo que quiero que haga es que verifique si en una lista hay al menos dos elementos que sean iguales, a la vez que encuentre al menos dos iguales quiero que salga y deje una variable C igual a 1.

Pero me est谩 dando error cuando le doy compilar. Alguien me podr铆a orientar en qu茅 tengo mal en el c贸digo??

Aqu铆 se los dejo comentariado para que vean que pretendo en cada l铆nea.
El predicado Verifica_iguales le paso una lista que se recorre poco a poco pas谩ndole cada elemento de la lista al predicado pertenece el cual verifica que en el resto de la lista no exista otro igual a ese. La variable C devuelve valor 1 si hay al menos 1 repetido en la lista o 0 sino encuentra. El predicado pertenece me funciona bien. Me esta dando problemas con el verifica. Ay煤denme soy nueva en prolog!!!
Gracias de antemano.


Verifica_iguales([],0).
Verifica_iguales(L,1):-!.
Verifica_iguales([X/L],C):- pertenece(X,L,C),
Verifica_iguales(L,C).

pertenece(X,[],0).
pertenece(X,[X|_],1):-!.
pertenece(X,[_|L1],C) :- pertenece(X,L1,C).




///////////////////////////////////////////////////////////////////Hasta aqu铆 el c贸digo

1era linea: Si recorri贸 la lista completa y no hay iguales entonces C=0
2da linea: Si C = 1, encontr贸 algo, entonces sale.
3era linea: Verif igual, Dev C=1 encontr贸, C=0 no encontr贸.
4ta linea : LLama recurs a la funci贸n hasta que C=1 o L=[].

1era pertenece: Si recorri贸 toda la lista y no encontr贸, C=0.
2da pertenece: comp a X con c/a elemt de la lista, si encuen C=1 y sale.
3era pertenece: Sino, C sigue sin valor, y llamo a la funci贸n recursivamente con el resto de los elementos de la lista.


El error que me da al compilar es:

! ----------------------------------------

! Error 23 : Type Error

! Goal : def([],2,_3074

Aborted

| ?-

jero_tv
12 de Agosto del 2009
mira, he hecho tu programa de otra forma. utilizo los comandos de prolog select (ejemplo: select(1,[1,2,3,1,5],Lista) --> Lista devuelve [2,3,1,5], es decir, lo que hace es borrar la primera ocurrencia del elemento.
Tambi茅n he usado member que es el 'pertenece' que tienes t煤.
Yo lo he probado y va bien, si quieres ver el seguimiento del programa usa los comandos siguientes: guitracer. (pulsas Intro) trace. (pulsas intro) algunos_iguales([1,2,3,2,5],C).
Te aparecer谩 entonces la pantalla de seguimiento, y podr谩s ejecutarlo paso a paso pulsando la barra espaciadora.


Bueno, 茅ste es el c贸digo:

algunos_iguales([_|[]],0).

algunos_iguales(Lista,1):-
select(X,Lista,Laux),
member(X,Laux),!.

algunos_iguales(Lista,C):-
select(X,Lista,Laux),
not(member(X,Laux)),
resto(Lista,Raux),
algunos_iguales(Raux,C).

resto([_|L],L).

Espero que te sirva, un saludo.