在Prolog的树叶遍历

时间:2015-10-17 12:32:08

标签: prolog

我在训练prolog练习时遇到一些问题,下面的问题是,

谓词定义了树的含义,可用于测试术语是否为树:

<type>_iterator

通过使用此谓词,您可以在树中找到一个元素(称为叶子):

[self.navigationController setNavigationBarHidden:YES animated:YES];

所以这里有两个问题,首先是写谓词tree(t(L,R)) :- tree(L), tree(R). tree(T) :- T\=t(_ , _). ,它产生一个元素列表,因为它们是在第一个参数中的树叶中以从左到右的顺序找到的!

第二个是编写一个谓词相同的leaf(t(L,R),E) :- leaf(L,E); leaf(R,E). leaf(T,T) :- T\=t(_ , _). ,当两棵树以相同的顺序包含相同的元素时,它就会成功!重复是重要的。

希望能让任何擅长prolog的人都能帮助我,非常感谢。

1 个答案:

答案 0 :(得分:2)

tree/1leaf/1 de 错误 1,2 ! 为什么不使用这样的清洁表示?

is_tree(leaf(_)).
is_tree(bin(L,R)) :-
   is_tree(L),
   is_tree(R).

请注意:

  • is_tree/1tree/1leaf/1更通用:它可以生成以及 test 树 - 甚至做两件事(如果参数部分实例化的话)。

  • is_tree/1 从不给出逻辑上不健全的答案 - 无论使用哪种“模式”。

is_tree/1的一些示例用法:

?- is_tree(T).                                   % generate
  T  = leaf(_A)
; T = bin(leaf(_A),leaf(_B))
; T = bin(leaf(_A),bin(leaf(_B),leaf(_C)))
; T = bin(leaf(_A),bin(leaf(_B),bin(leaf(_C),leaf(_D))))
...

?- is_tree(bin(leaf(1),bin(leaf(2),3))).         % test
false.

?- is_tree(bin(leaf(1),bin(leaf(2),leaf(3)))).   % test
true.

?- T = bin(bin(leaf(1),2),_), is_tree(T).        % do both (or at least try)
false.

?- T = bin(bin(leaf(1),leaf(2)),_), is_tree(T).  % do both
T = bin(bin(leaf(1),leaf(2)),leaf(_A))
T = bin(bin(leaf(1),leaf(2)),bin(leaf(_A),leaf(_B)))
T = bin(bin(leaf(1),leaf(2)),bin(leaf(_A),bin(leaf(_B),leaf(_C)))) 
...

回到您关于如何实施elements/2content/2的问题... 使用

leaves(leaf(E))  --> [E].
leaves(bin(L,R)) --> leaves(L), leaves(R).

same_content(A,B) :-
   phrase(leaves(A),Ls),
   phrase(leaves(B),Ls).

示例查询:

?- same_content(bin(leaf(1),bin(leaf(2),leaf(3))), 
                bin(bin(leaf(1),leaf(2)),leaf(3))).
true.

脚注1:rock-solid treatise on teaching Prolog讨论了许多常见障碍,包括 defaultyness
脚注2:this answer @mat解释了Prolog中的defaultyness如何阻止声明性调试和推理。