Prolog:对称规则

Prolog: Symmetric Rules

我正在学习要求定义对称关系的 Prolog 教程。

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

colleague(john,bob).

您还希望 colleague(bob,john) 为真,对于所有 colleague facts 也是如此。

教程说要使用以下规则...

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

_

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

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

知道我做错了什么吗?

我认为您必须使规则与事实有所区别。例如:

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