Prolog:对称规则

Wol*_*lff 3 prolog logic-programming

我正在按照Prolog教程要求定义对称关系.

比如说你在知识库中有以下事实:

colleague(john,bob).
Run Code Online (Sandbox Code Playgroud)

你也希望同事(鲍勃,约翰)是真实的,同样也适用于所有同事的事实.

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

colleague(X,Y) :- colleague(Y,X).
Run Code Online (Sandbox Code Playgroud)

但是当我使用以下查询时执行此操作时会出现问题...

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

| ? - colleague(bob,X).
X = john ? ;
X = john ? ;
X = john ? ;
X = john ? ;
...
Run Code Online (Sandbox Code Playgroud)

我想我明白为什么会这样 - 规则是无限递归的?但是我遇到了修复它的问题.这就是我要的...

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

| ? - colleague(bob,X).
X = john ? ;
no
Run Code Online (Sandbox Code Playgroud)

我已经看过这里非常相似的问题的其他答案,但是无法对它进行排序.我已经尝试在规则的末尾使用剪切,这似乎表现更好,但仍然重复一次,因为知识库中包含的事实:

colleague(X,Y) :- colleague(Y,X), !.
Run Code Online (Sandbox Code Playgroud)

_

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

| ? - colleague(bob,X).
X = john ? ;
no
Run Code Online (Sandbox Code Playgroud)

我有什么想法我做错了吗?

Vau*_*ato 5

我认为你必须使规则与事实不同.例如:

known_colleague(bob,john).
colleague(X,Y) :- known_colleague(X,Y);known_colleague(Y,X).
Run Code Online (Sandbox Code Playgroud)