我的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)为true(仅),但f(a,b)和f(a,c)均为true和false。这是怎么回事,我该怎么做,以便Prolog回答(仅)对这些查询的回答是正确的?

最佳答案

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

考虑一下Prolog如何确定f(a,c)是否为真。它检查第一个规则f(a,b),但没有找到匹配项,但是第二个规则f(a,c)匹配。因此,f(a,c)为true。而且,由于没有更多的f规则,因此没有必要允许回溯发生-没有其他可能的解决方案。

现在考虑f(a,b)。 Prolog将检查第一个规则,并找到一个匹配项。因此,f(a,b)为true。但是,并非所有规则都已用尽。因此,Prolog将允许继续搜索(如果您按下;)。当您继续搜索和回溯时,它将发现其余规则(特别是f(a,c))与f(a,b)不匹配。因此,结果是错误的。

关于prolog - 为什么此序言查询同时为真和假?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3323201/

10-13 09:05