Используйте cut в Прологе для определения функции once_member / 2

Отказ от ответственности: это неофициальная и не оцениваемая курсовая работа, которую нужно выполнять в свое время. Я сам пробовал, но потерпел неудачу и теперь ищу рекомендации.

Я пытаюсь реализовать версию функции 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 Книги)

Руководство по логическому применению сокращения было бы наиболее полезным, но ответ мог бы помочь мне разобраться в этом сам.

Нам также сказали сделать другой метод, который использует отрицание '\ +' при неудаче, но, надеюсь, это может быть проще, если вырезать для меня ветку?

8
задан repeat 6 November 2015 в 12:28
поделиться