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

时间:2013-11-05 22:24:56

标签: 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])

1 个答案:

答案 0 :(得分:0)

要创建搜索树,请从查询开始,逐步执行假装为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)