No estoy seguro si esto es tarea/hay restricciones sobre qué predicados se le permite usar, pero esto obtiene prolog para hacer la recursión para usted.
Dice ... encontrar todos los duplicados, es decir. donde hay un elemento con el índice de lista I1 y otro con I2, de modo que ambos tienen el mismo valor N, y los índices no son los mismos, es decir, no consideran el mismo elemento de lista como un duplicado.
Estos duplicados se ponen (en el orden en que se encuentran, desde el principio crucialmente) en la lista AllDups, y el predicado es verdadero si el primer duplicado encontrado se unifica con M, el valor que está comprobando.
primer intento: Esto funciona, pero es muy ineficiente, la construcción de una lista de todos los duplicados
prep(M, List) :-
findall(N,
(nth0(I1, List, N),
nth0(I2, List, N),
not(I1 =:= I2)),
AllDups),
nth1(1, AllDups, M).
?- prep(3,[1,3,5,3,5]).
true.
?- prep(5,[1,3,5,3,5]).
false.
Incluso si usted no está autorizado a utilizar findall, podría ayudarle a resolver cómo hacerlo ' a mano'.
segundo intento: Esto no funciona/retrocede demasiado produciendo un falso positivo
Incluso puede hacerlo sin la findall - nth0 utilizar para encontrar el primer elemento duplicado, a continuación, si es que se unifica con el valor que está comprobando, devuelve verdadero, de lo contrario es falso.
prep(N, List) :-
nth0(I1, List, N),
nth0(I2, List, N),
not(I1 =:= I2).
tercer intento: Esto funciona, y devuelve tan pronto como el primer duplicado se ha encontrado
prep(M, List) :-
nth0(I1, List, N),
nth0(I2, List, N),
not(I1 =:= I2), !,
M == N.
Sigo siendo un iniciador de Prolog y esto es un poco difícil de entender para mí. No se nos enseña Prolog en las clases y apenas tengo tiempo para aprender decentemente por mi cuenta, este ejercicio solo se me ha dado y he estudiado por mi cuenta, así que intentaré comprenderlo mejor más adelante. ¡Gracias por tu tiempo! :) – Zezinho
De nada ... es un lenguaje extraño, no tengo dudas. Hace mucho por usted, en lugar de tener que decirle qué hacer todo el tiempo, por lo que debe comprender qué puede hacer detrás de las coberturas para encontrar la solución más adecuada. – magus
con su última adición, 'prep (5, [1,3,5,3,5]).' Devuelve 'true' también. '? - prep (N, [1,3,5,3,5]). N = 3; N = 5; N = 3; N = 5; No'. –