我遵循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
任何想法我做错了什么?
答案 0 :(得分:5)
我认为你必须使规则与事实不同。例如:
known_colleague(bob,john).
colleague(X,Y) :- known_colleague(X,Y);known_colleague(Y,X).