Не уверен, что это домашнее задание/существуют ограничения на то, какие предикаты вы можете использовать, но это дает пролог, чтобы сделать рекурсию для вас.
В нем говорится: найдите все дубликаты, т.е. где есть элемент с индексом списка I1, а другой с I2, так что они оба имеют одно и то же значение N, а индексы не совпадают, т. е. не учитывать тот же элемент списка, что и дубликат.
Эти дубликаты помещаются (в порядке их нахождения, с самого начала в решающем порядке) в списке AllDups, и предикат является истинным, если первый дубликат найден слиянием с M, значением, которое вы проверяете.
Первая попытка: Это работает, но это очень неэффективно, строительство список всех дублей
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.
Даже если вы не можете использовать FindAll, это может помочь вам решить, как это сделать " вручную'.
Вторая попытка: Это не работает/откатывается слишком далеко уступая ложноположительный
Вы даже можете сделать это без FindAll - использовать nth0 найти первый элемент дубликат, а затем, если это унифицирует с значение, которое вы проверяете, оно возвращает true, иначе false.
prep(N, List) :-
nth0(I1, List, N),
nth0(I2, List, N),
not(I1 =:= I2).
Третья попытка: Это работает, и возвращается, как только первый дубликат был найден
prep(M, List) :-
nth0(I1, List, N),
nth0(I2, List, N),
not(I1 =:= I2), !,
M == N.
Я по-прежнему пролог, но для меня это немного сложно понять. Мы не учили Prolog в классах, и я едва успел выучить его прилично самостоятельно, это упражнение было дано только самообучением, поэтому я постараюсь лучше понять его позже. Спасибо за ваше время! :) – Zezinho
Добро пожаловать. Это странный язык, не сомневайтесь. Он делает так много для вас, вместо того, чтобы вам рассказывать, что делать все время, и поэтому вам нужно понять, что он может сделать за обложками, чтобы придумать самое опрятное решение. – magus
с вашим последним дополнением, 'prep (5, [1,3,5,3,5]).' Возвращает 'true'. '? - prep (N, [1,3,5,3,5]). N = 3; N = 5; N = 3; N = 5; No'. –