我在训练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的人都能帮助我,非常感谢。
答案 0 :(得分:2)
tree/1
和leaf/1
de 错误 1,2 !
为什么不使用这样的清洁表示?
is_tree(leaf(_)). is_tree(bin(L,R)) :- is_tree(L), is_tree(R).
请注意:
is_tree/1
比tree/1
和leaf/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/2
和content/2
的问题... 使用dcg!
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如何阻止声明性调试和推理。