证明树
证明树(也是搜索树或派生树)是一个显示 Prolog 程序执行的树。这棵树有助于可视化 Prolog 中的时间顺序回溯过程。树的根表示初始查询,并在出现选择点时创建分支。因此,树中的每个节点都代表一个目标。当在所需(一组)目标中证明 true / false 时,分支仅成为叶子,并且 Prolog 中的搜索以从左到右的深度优先方式执行。
请考虑以下示例:
% Facts
father_child(paul,chris). % Paul is the father of Chris and Ellen
father_child(paul,ellen).
mother_child(ellen,angie). % Ellen is the mother of Angie and Peter
mother_child(ellen,peter).
% Rules
grandfather_grandchild(X,Y) :-
father_child(X,Z),
father_child(Z,Y).
grandfather_grandchild(X,Y) :-
father_child(X,Z),
mother_child(Z,Y).
当我们现在查询:
?- grandfather_grandchild(paul,peter).
以下证明树可视化深度优先搜索过程:
?- grandfather_grandchild(paul,peter).
/ \
/ \
?- father_child(paul,Z1),father_child(Z1,peter). ?- father_child(paul,Z2),mother_child(Z2,peter).
/ \ / \
{Z1=chris} {Z1=ellen} {Z2=chris} {Z2=ellen}
/ \ / \
?- father_child(chris,peter). ?- father_child(ellen,peter). ?- mother_child(chris,peter). ?- mother_child(ellen,peter).
| | | / \
fail fail fail fail(*) success
(*)对于 mother_child(ellen,angie)
失败,其中’angie’未能匹配’peter'