Как убрать повтор в выводе в прологе - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть этот код:

likes(ali, football). 
likes(ali, tennis). 
likes(ahmad, tennis). 
likes(ahmad, handball). 
likes(samir, handball). 
likes(samir, swimming). 
likes(khaled, horseriding).   

friends(P1, P2):-
    likes(P1, G1), likes(P2, G1), P1\=P2.

ввод:

friends(X, Y)

вывод

X = ali,
Y = ahmad
X = ahmad,
Y = ali
X = ahmad,
Y = samir
X = samir,
Y = ahmad

Как удалить это повторение, если это возможно.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

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

friend(P3,P4) :-
    likes(P1,G1),
    likes(P2,G1),
    P1 \= P2,
    normalize(P1,P2,P3,P4).

normalize(P1,P2,P1,P2) :- P1 @> P2.

normalize(P1,P2,P2,P1) :- P1 @=< P2.

friends(List) :-
    setof((P1,P2), (P1,P2)^friend(P1,P2), List).

Пример:

?- friends(List).
List = [(ali, ahmad),  (samir, ahmad)].
0 голосов
/ 05 декабря 2018

Вы можете добавить предикаты, которые должны проверяться, когда переменная была связана: когда / 2 :

when(ground(X+Y), X @< Y), friends(X,Y).

Как только в термине X+Y больше нет свободных переменных,затем убедитесь, что X @< Y:

?- when(ground(X+Y), X @< Y), test:friends(X,Y).
X = ahmad,
Y = ali ;
X = ahmad,
Y = samir ;

Это полезно для вашего теста, но, вообще говоря, я не думаю, что повторение необходимо удалить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...