Prolog为查询编写一个完整的搜索树

Prolog为查询编写一个完整的搜索树,prolog,search-tree,Prolog,Search Tree,因此,对于我的类,我被要求为下面的查询编写一个完整的搜索树。我已经得到了一个例子表,但老实说,我的眼睛呆呆地看着它。有没有人能一步一步地告诉我这个过程,并尽你所能向我解释清楚 这就是我得到的: p([], _). p([H|T], [H|T2]) :- p(T, T2). q(X, X). q(X, [_|T]) :- q(X, T). 以及查询 p(X, [a,b,c]), q(X, [a,b,c]) 要创建搜索树,您需要从查询开始,然后假装是Prolog解释器,逐步遍历子句。树中

因此,对于我的类,我被要求为下面的查询编写一个完整的搜索树。我已经得到了一个例子表,但老实说,我的眼睛呆呆地看着它。有没有人能一步一步地告诉我这个过程,并尽你所能向我解释清楚

这就是我得到的:

p([], _). 
p([H|T], [H|T2]) :- p(T, T2). 
q(X, X). 
q(X, [_|T]) :- q(X, T).
以及查询

 p(X, [a,b,c]), q(X, [a,b,c])

要创建搜索树,您需要从查询开始,然后假装是Prolog解释器,逐步遍历子句。树中的块表示要执行的下一个子句,树的分支表示正在发生的变量实例化。如果这个案例很复杂,那么从一个非常简单的案例开始了解这个想法。网上有好几种

这里只有一条穿过树的路径,我将把它作为一个练习来填充其余的路径:

?- p(X, [a,b,c]), q(X, [a,b,c])
   |
   | X = []
{来自第一个匹配子句的结果:p[],}

{匹配第二个q子句的结果,qX,[| T]。第一个q子句不匹配}

   |
   q([], [b,c])
   |
   | [] = X, [b,c] = [_|T] (so T = [c])
{匹配第二个q子句的结果}

{匹配第二个q子句的结果}

{匹配第一个q子句qX,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)  

我甚至不明白你的要求。
   |
   q([], [c])
   |
   | [] = X, [c] = [_|T] (so T = [])
   |
   q([], [])
   |
   | [] = X
   |
   SUCCESS (X = [])
?- 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)