Prolog:对称规则

时间:2015-10-02 14:24:25

标签: prolog logic-programming

我遵循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

我已经在这里查看了非常类似问题的其他答案,但是还没有能够对它进行排序。我已尝试在规则的最后使用剪切,这似乎表现更好但仍然重复一次,因为知识库中包含了这一事实:

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

_

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

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

任何想法我做错了什么?

1 个答案:

答案 0 :(得分:5)

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

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