我的 SWI-Prolog 知识库包含以下两个事实:
f(a,b).
f(a,c).
现在,如果我提出查询
?- f(a,c).
true.
但
?- f(a,b).
true ;
false.
为什么 f(a,b) 既真又假?当知识库中有三个事实时,也会发生这种情况。如果我附加 f(a,d)。到 KB,则 f(a,d) 为真(仅),但 f(a,b) 和 f(a,c) 既为真又为假。发生了什么事,我该怎么做才能使 Prolog (仅)回答这些查询?
我的 SWI-Prolog 知识库包含以下两个事实:
f(a,b).
f(a,c).
现在,如果我提出查询
?- f(a,c).
true.
但
?- f(a,b).
true ;
false.
为什么 f(a,b) 既真又假?当知识库中有三个事实时,也会发生这种情况。如果我附加 f(a,d)。到 KB,则 f(a,d) 为真(仅),但 f(a,b) 和 f(a,c) 既为真又为假。发生了什么事,我该怎么做才能使 Prolog (仅)回答这些查询?
(注意:这个答案有点猜测)
考虑 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)
。因此,结果是错误的。
除了迈克尔威廉姆森的回答。如果你想告诉 Prolog 在第一次成功命中后停止寻找答案,那么使用 cut ( !
):
?- f(a, b), !.
true.
?- f(a, c), !.
true.