序言中的重复结果

发布于 2024-11-06 21:13:46 字数 327 浏览 2 评论 0原文

我对序言感到很糟糕。我在这个简单的代码中不断得到重复的结果“

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

调用朋友(bob,X)。我得到了 bob 两次。如果我可以使用 IF 语句就好了!

我怎样才能消除重复的结果?IE If(result1 == result2 )不要打印;

我正在寻找类似的朋友,即结果应该是鲍勃和安德里亚(因为比尔)。

I'm terrible with prolog. I keep getting a duplicate result in this simple code"

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

Calling friends(bob, X). I get bob twice. If only I could use and IF statement argh!!!

How can I elimiate duplicate results? IE If(result1 == result2) dont print;

Im looking for similar friends, ie the result should be bob and andrea (because of bill).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

机场等船 2024-11-13 21:13:46

难道不应该更多地遵循这些思路吗?

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 的伴侣。您的解决方案可能应该考虑到这一点。

Shouldn't it be more along these lines?

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

If you want similar friends (per your comment below), try:

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

The \= operator means 'not unifiable with', so that should exclude cases where party A is friends with his- or herself. The exact operator for 'not unifiable with' might vary depending on implementation.

Also bear in mind that the "correct" solution is a bit more convoluted than it might seem the mates relationship is transitive: if Andrea is a mate of Bills, the presumably Bill is a mate of Andrea's. You solution should likely take that into account.

若相惜即相离 2024-11-13 21:13:46
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).

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文