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)
我有什么想法我做错了吗?
我认为你必须使规则与事实不同.例如:
known_colleague(bob,john).
colleague(X,Y) :- known_colleague(X,Y);known_colleague(Y,X).
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
309 次 |
| 最近记录: |