Повторяющиеся результаты в прологе - PullRequest
0 голосов
/ 11 мая 2011

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

mates(bob, john).
mates(bob, bill).
mates(andrea, sara).
mates(andrea, bill).
friends(X, Y) :- mates(X, Z), mates(Y, Z).

Звоню друзьям (Боб, Х). Я получаю Боба дважды. Если бы я только мог использовать оператор IF ахх !!! !!! 1004 *

Как я могу устранить дублирующиеся результаты? IE Если (result1 == result2) не печатать;

Я ищу похожих друзей, то есть результат должен быть bob и andrea (из-за счета).

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

Разве это не должно быть больше по этим направлениям?

friends( X , Y ) :- mates( X , Y ).
friends( X , Y ) :- mates( X , T ) , mates( T , Y ).

Если вы хотите похожих друзей (за ваш комментарий ниже), попробуйте:

friend( X , Y ) :-
  mates( X , T ) ,
  mates( Y , T ) ,
  X \= Y .

Оператор \= означает «не различим с», поэтому он должен исключать случаи, когда сторона А дружит с собой. Точный оператор 'not unifiable with' может варьироваться в зависимости от реализации.

Также имейте в виду, что «правильное» решение является немного более запутанным, чем может показаться, что отношения между товарищами переходные: если Андреа является партнером Билла, предположительно, Билл является партнером Андреа. Ваше решение, вероятно, должно принять это во внимание.

1 голос
/ 11 мая 2011

mates(bob, john).
mates(bob, bill).
mates(andrea, sara).
mates(andrea, bill).

friends(X, Y) :-
        setof([X,Y],(friends2(X,Y),\+(X=Y)),L),
        append(L0,[[X,Y]|_],L),
        \+(append(_,[[Y,X]|_],L0)).

friends2(X, Y) :- mates(X, Z), mates(Y, Z).
friends2(X, Y) :- mates(X, Z), mates(Z, Y).
friends2(X, Y) :- mates(Z, X), mates(Z, Y).
friends2(X, Y) :- mates(Z, X), mates(Y, Z).

...