Уникальность числа в списке в прологе - PullRequest
0 голосов
/ 07 марта 2019

Я уже написал этот код (который я нашел здесь в Stack Overflow и немного его изменил)

unique(M,List) :- 
 append(X,Y,List),
 member(M,X),
 member(M,Y).

Но он полностью противоположен тому, что я хочу.

дляНапример, ожидается, что эти результаты дадут.

?- unique(1,[1,2,3]).
yes

?- unique(1,[1,2,3,1]).
no

, но вместо этого он дает

?- unique(1,[1,2,3]).
no

?- unique(1,[1,2,3,1]).
yes

, есть ли способ, которым я могу изменить свой код, чтобы дать желаемыйрезультаты?

1 Ответ

0 голосов
/ 07 марта 2019

Ваш код фактически говорит: «M уникален в List, если List можно разделить на две части, X и Y, а M присутствует в X и Y». Это очень умный способ сделать прямо противоположное тому, что вы хотите.

Вот еще один способ узнать, является ли X уникальным в List: если я возьму X из List, X больше не будет в List. Вы можете превратить это в Пролог так:

unique(X, List) :-
    select(X, List, ListWithoutX),
    \+ memberchk(X, ListWithoutX).
...