为什么 SWI-Prolog 在没有更多结果可显示时不显示 'false'
Why SWI-Prolog doesn't display 'false' when there aren't any more results to show
我正在阅读一本 Prolog 书籍,目前正在尝试以下示例。
我的事实是;
parent(tom, bob).
parent(pam, bob).
parent(tom, liz).
parent(bob, ann).
parent(bob, pat).
parent(pat, jim).
我查询 Prolog 为:
?- parent(X, Y).
结果是;
X = tom,
Y = bob ;
X = pam,
Y = bob ;
X = tom,
Y = liz ;
X = bob,
Y = ann ;
X = bob,
Y = pat ;
X = pat,
Y = jim
为什么 Prolog 不在末尾显示“false”以表明不再有可能的结果?
此外,我尝试了以下查询。但它给了我意想不到的不同结果,给出了额外的'false'。你能告诉我这是什么原因吗?
?- parent(Y,jim), parent(X,Y).
Y = pat,
X = bob.
?- parent(X,Y), parent(Y,jim).
X = bob,
Y = pat ;
false.
我正在使用 SWI-Prolog 版本(线程,64 位,版本 8.2.4)。
SLD 解析,Prolog 的证明过程,隐式定义了一个搜索树 的替代计算。
Prolog 使用深度优先策略搜索这棵树,一次一个分支,遇到失败节点时回溯。
仅当搜索期间访问的最后一个节点是失败节点时,SWI-Prolog 才打印 false
。
考虑程序:
parent(tom,bob). % parent.1
parent(pam,bob). % parent.2
parent(tom,liz). % parent.3
parent(bob,ann). % parent.4
parent(bob,pat). % parent.5
parent(pat,jim). % parent.6
搜索树是:
- 第一次查询:
- 第二次查询:
我正在阅读一本 Prolog 书籍,目前正在尝试以下示例。 我的事实是;
parent(tom, bob).
parent(pam, bob).
parent(tom, liz).
parent(bob, ann).
parent(bob, pat).
parent(pat, jim).
我查询 Prolog 为:
?- parent(X, Y).
结果是;
X = tom,
Y = bob ;
X = pam,
Y = bob ;
X = tom,
Y = liz ;
X = bob,
Y = ann ;
X = bob,
Y = pat ;
X = pat,
Y = jim
为什么 Prolog 不在末尾显示“false”以表明不再有可能的结果?
此外,我尝试了以下查询。但它给了我意想不到的不同结果,给出了额外的'false'。你能告诉我这是什么原因吗?
?- parent(Y,jim), parent(X,Y).
Y = pat,
X = bob.
?- parent(X,Y), parent(Y,jim).
X = bob,
Y = pat ;
false.
我正在使用 SWI-Prolog 版本(线程,64 位,版本 8.2.4)。
SLD 解析,Prolog 的证明过程,隐式定义了一个搜索树 的替代计算。
Prolog 使用深度优先策略搜索这棵树,一次一个分支,遇到失败节点时回溯。
仅当搜索期间访问的最后一个节点是失败节点时,SWI-Prolog 才打印 false
。
考虑程序:
parent(tom,bob). % parent.1
parent(pam,bob). % parent.2
parent(tom,liz). % parent.3
parent(bob,ann). % parent.4
parent(bob,pat). % parent.5
parent(pat,jim). % parent.6
搜索树是:
- 第一次查询:
- 第二次查询: