【问题标题】:Prolog Write an entire search tree for a queryProlog 为一个查询写一个完整的搜索树
【发布时间】:2013-11-05 22:24:56
【问题描述】:

所以对于我的班级,我被要求为下面的查询编写一个完整的搜索树。我得到了一个示例表,但老实说,我的眼睛盯着它看。有人可以逐步指导我完成该过程,并尽可能向我解释,您将不胜感激。

这是给我的:

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 search-tree


【解决方案1】:

要创建搜索树,您可以从查询开始,然后逐步检查假装是 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)  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多