prolog中的重复结果

时间:2011-05-11 00:35:03

标签: if-statement prolog duplicates

我对prolog感到很糟糕。我在这个简单的代码中继续得到重复的结果“

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

给朋友打电话(鲍勃,X)。我两次得到鲍勃。如果我能使用和IF声明argh !!!

如何删除重复结果? IE如果(result1 == result2)不打印;

我正在寻找类似的朋友,即结果应该是bob和andrea(因为账单)。

2 个答案:

答案 0 :(得分:2)

这条线不应该更多吗?

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 .

\=运算符意味着'不能与'合并',因此应排除甲方与自己成为朋友的情况。 “不可统一”的确切运算符可能会因实施而异。

另外请记住,“正确”的解决方案比看起来配偶关系具有传递性更复杂:如果Andrea是Bills的配偶,那么可能Bill就是Andrea的配偶。您的解决方案应该考虑到这一点。

答案 1 :(得分:1)


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).