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).
我正在学习要求定义对称关系的 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).