del*_*del 30 prolog swi-prolog prolog-toplevel
我的SWI-Prolog知识库包含以下两个事实:
f(a,b).
f(a,c).
Run Code Online (Sandbox Code Playgroud)
现在,如果我提出查询
?- f(a,c).
true.
Run Code Online (Sandbox Code Playgroud)
但
?- f(a,b).
true ;
false.
Run Code Online (Sandbox Code Playgroud)
为什么f(a,b)既真又假?当KB中有三个事实时,也会发生这种情况.如果我追加f(a,d).到KB,然后f(a,d)为真(仅),但f(a,b)和f(a,c)都是真和假.发生了什么,我能做些什么让Prolog回答(仅)回答这些问题?
Mic*_*son 27
(注意:这个答案有点猜)
考虑Prolog如何判断是否f(a,c)真实.它会检查第一个规则,f(a,b)但找不到匹配项,但第二个规则f(a,c)匹配.因此,f(a,c)是真的.此外,由于没有更多的规则f,没有必要允许回溯发生 - 没有其他可能的解决方案.
现在考虑f(a,b).Prolog将检查第一条规则,并找到匹配项.因此,f(a,b)是真的.但是,并非所有规则都已用尽.因此,Prolog将允许搜索继续(如果你点击;).当您继续搜索并回溯时,它会发现其余规则,特别f(a,c)是不匹配f(a,b).因此,结果是错误的.
Kaa*_*rel 13
除了迈克尔威廉姆森的回答.如果你想告诉Prolog在第一次成功点击后停止寻找答案,那么使用cut(!):
?- f(a, b), !.
true.
?- f(a, c), !.
true.
Run Code Online (Sandbox Code Playgroud)