我对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(因为账单)。
答案 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).