Prolog 序言:对称规则

Prolog 序言:对称规则,prolog,logic-programming,Prolog,Logic Programming,我正在学习一个Prolog教程,它要求定义一个对称关系 例如,假设您在知识库中有以下事实: colleague(john,bob). 您还希望同事(鲍勃、约翰)是真实的,同样,所有同事的事实也是真实的 教程说要使用以下规则 colleague(X,Y) :- colleague(Y,X). 但是当我使用下面的查询时,会遇到一些问题 | ? - colleague(john,X). X = bob ? ; X = bob ? ; X = bob ? ; X = bob ? ; ... | ?

我正在学习一个Prolog教程,它要求定义一个对称关系

例如,假设您在知识库中有以下事实:

colleague(john,bob).
您还希望同事(鲍勃、约翰)是真实的,同样,所有同事的事实也是真实的

教程说要使用以下规则

colleague(X,Y) :- colleague(Y,X).
但是当我使用下面的查询时,会遇到一些问题

| ? - colleague(john,X).
X = bob ? ;
X = bob ? ;
X = bob ? ;
X = bob ? ;
...

| ? - colleague(bob,X).
X = john ? ;
X = john ? ;
X = john ? ;
X = john ? ;
...
我想我理解为什么会发生这种情况——规则是无限递归的?但我在修复它时遇到了问题。这就是我想要的

| ? - colleague(john,X).
X = bob ? ;
no

| ? - colleague(bob,X).
X = john ? ;
no
我已经看过其他类似问题的答案,但还没有整理出来。我试着在规则的末尾使用一个cut,它似乎表现得更好,但由于知识库中包含的事实,它仍然会重复一次:

colleague(X,Y) :- colleague(Y,X), !.
_


你知道我做错了什么吗?

我想你得把规则和事实区别开来。例如:

known_colleague(bob,john).
colleague(X,Y) :- known_colleague(X,Y);known_colleague(Y,X).

请看地图。添加
/0
只会完全破坏关系,因此我强烈建议避免这种情况。作为一个简单的检查,请始终尝试最一般的查询(在您的情况下:
?-同事(X,Y)。
)并查看它是否仍然与您最初的意思相同。您将发现,使用
/0
彻底确保了它不会。我还没有完全理解切割的用法,因为我们本周在课堂上才刚刚讨论过它,所以我有点不确定它的用法。谢谢你指出这一点!使用
/0附带了一条简单的规则:简而言之,不要。在使用它们时,很可能会完全破坏程序语义。作为一个初学者,使用
真的没有什么好处/0
,只会损失大量时间。这很有效,谢谢!我不确定这是否是教程打算让我找到的解决方案,但我很乐意接受。
known_colleague(bob,john).
colleague(X,Y) :- known_colleague(X,Y);known_colleague(Y,X).