31

我的 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 (仅)回答这些查询?

4

2 回答 2

31

(注意:这个答案有点猜测)

考虑 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)。因此,结果是错误的。

于 2010-07-24T00:11:39.680 回答
15

除了迈克尔威廉姆森的回答。如果你想告诉 Prolog 在第一次成功命中后停止寻找答案,那么使用 cut ( !):

?- f(a, b), !.
true.

?- f(a, c), !.
true.
于 2010-07-24T02:11:53.537 回答