我的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/