要创建搜索树,您可以从查询开始,然后逐步检查假装是 Prolog 解释器的子句。树中的块代表下一个要执行的子句,树的“腿”是正在发生的变量实例化。如果这个案例很复杂,可以从一个非常简单的案例开始理解。网上有几个examples。
这只是穿过树的一条路径,我将把它留作练习来填充其余部分:
?- p(X, [a,b,c]), q(X, [a,b,c])
|
| X = []
{ 第一个匹配子句的结果:p([], _). }
|
q([], [a,b,c]) % `p` clause succeeded, moving on to `q` in the query
|
| [] = X, [a,b,c] = [_|T] (so T = [b,c])
{ 匹配第二个q 子句q(X, [_|T]) 的结果。第一个 q 子句不匹配 }
|
q([], [b,c])
|
| [] = X, [b,c] = [_|T] (so T = [c])
{ 匹配第二个q 子句的结果}
|
q([], [c])
|
| [] = X, [c] = [_|T] (so T = [])
{ 匹配第二个q 子句的结果}
|
q([], [])
|
| [] = X
{ 匹配第一个 q 子句 q(X, X). }
|
SUCCESS (X = [])
第一个子句的另一个分支要遵循,它对应于匹配第二个p子句而不是第一个:
?- p(X, [a,b,c]), q(X, [a,b,c])
| \
| X = [] \ X = [H|T] [a,b,c] = [H|T2] (H = a and T2 = [b,c])
| \ p([a|T], [a|[b,c]]) % matches second `p` clause
... \
(first p match ... (continue)
shown above)