Отказ от ответственности: это неофициальная и не оцениваемая курсовая работа, которую нужно выполнять в свое время. Я сам пробовал, но потерпел неудачу и теперь ищу рекомендации.
Я пытаюсь реализовать версию функции member / 2, которая будет возвращать элементы только один раз.
Например:
| ?- member(X, [1,2,3,1]).
X = 1 ? ;
X = 2 ? ;
X = 3 ? ;
X = 1 ? ;
Я бы хотел, чтобы каждое число выводилось не более одного раза.
| ?- once_member(X, [1,2,3,1]).
X = 1 ? ;
X = 2 ? ;
X = 3 ? ;
no
Нам сказали делать это с сокращением «!» оператор, но я просмотрел заметки к моему курсу, чтобы вырезать и многое другое в Интернете, и все еще не могу заставить его щелкнуть в моей голове!
Пока мне удалось получить:
once_member(E, [E | L]) :- !.
once_member(E, [_, L]) :-
once_member(E, L).
Что возвращает 1 и больше ничего, я чувствую, что мой разрез находится не в том месте и предотвращает возврат для каждого возможного совпадения, но я действительно не уверен, куда идти с ним дальше.
Я просмотрел заметки к курсу, а также: http://www.cs.ubbcluj.ro/~csatol/log_funk/prolog/slides/5-cuts.pdf и Программирование на прологе (Google Книги)
Руководство по логическому применению сокращения было бы наиболее полезным, но ответ мог бы помочь мне разобраться в этом сам.
Нам также сказали сделать другой метод, который использует отрицание '\ +' при неудаче, но, надеюсь, это может быть проще, если вырезать для меня ветку?