为何Prolog执行简单connect查询时会提示更多结果并返回false?
Prolog查询结果差异的原因解析
先看你的代码:
% Doors door(kitchen, office). connect(X, Y) :- door(X, Y). connect(X, Y) :- door(Y, X).
以及查询结果:
?- connect(kitchen, office). true ; false. ?- connect(office, kitchen). true.
第一个查询connect(kitchen, office)的执行逻辑
- Prolog首先匹配
connect/2的第一个子句:connect(X,Y) :- door(X,Y)。这里X=kitchen、Y=office,正好对应你定义的door(kitchen, office)事实,所以直接返回true。 - 但Prolog会记录回溯点——因为
connect/2还有第二个子句没尝试。当你按下;键请求更多结果时,它会回溯到第二个子句,尝试匹配door(office, kitchen),但你并没有定义这个事实,匹配失败,所以返回false。
第二个查询connect(office, kitchen)的执行逻辑
- 首先尝试
connect/2的第一个子句:door(office, kitchen),这个事实不存在,匹配失败。 - 自动回溯到第二个子句:
connect(X,Y) :- door(Y,X),此时相当于检查door(kitchen, office),这个事实存在,所以返回true。 - 此时
connect/2的所有子句都已尝试完毕,没有更多回溯点,Prolog直接结束查询,不会提示还有更多结果。
总结一下:第一个查询的第一个子句匹配成功后,仍有未尝试的子句,所以Prolog会提示你继续查询;第二个查询只有第二个子句匹配成功,且无更多子句可试,因此直接结束。
内容的提问来源于stack exchange,提问作者Tom B.
相关产品推荐
相关产品推荐

