【问题标题】:Tree leaf traversal in PrologProlog中的树叶遍历
【发布时间】:2015-10-17 12:32:08
【问题描述】:

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

谓词定义了树的含义,可以用来测试一个词是否是树:

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(_ , _).

所以这里有两个问题,首先是编写谓词elements/2,它会生成一个元素列表,因为它们在第一个参数中以从左到右的顺序在树的叶子中找到!

第二个是写一个谓词相同的content/2,当两棵树以相同的顺序包含相同的元素时,它就成功了!重复很重要。

希望能得到擅长prolog的人能帮帮我,非常感谢。

【问题讨论】:

  • 您是否尝试过编写您想要的这些谓词?如果你在运行时检查leaf/2 的所有结果,你观察到结果的顺序是什么?
  • 使用更简洁的表示!照原样,您声明“与t(_,_) 无法统一的所有内容都是有效的树/叶”。
  • imo,elements/2 只是 findall/3,而 content/2 只是 elements/2 之间的连接
  • elements(Tree, Elements) :- findall( E, leaf(Tree, E), Elements ).content(Tree1, Tree2) :- elements(Tree1, E), elements(Tree2, E).
  • 嗨,潜伏者,谢谢,我认为这是最终答案。

标签: prolog prolog-defaulty


【解决方案1】:

tree/1leaf/1de有问题1,2! 为什么不使用这样更清晰的表示?

is_tree(叶子(_))。 is_tree(bin(L,R)) :- is_tree(L), is_tree(R)。

注意:

  • is_tree/1tree/1leaf/1 更通用:它可以生成以及测试树——甚至做两者都有一点(如果参数被部分实例化)。

  • is_tree/1从不给出逻辑上不合理的答案——无论它用于哪种“模式”。

is_tree/1 的一些示例用法:

?- is_tree(T)。 % 产生 T = 叶(_A) ; T = bin(叶子(_A),叶子(_B)) ; T = bin(叶子(_A),bin(叶子(_B),叶子(_C))) ; T = bin(叶子(_A),bin(叶子(_B),bin(叶子(_C),叶子(_D)))) ... ?- is_tree(bin(leaf(1),bin(leaf(2),3)))。 % 测试 错误的。 ?- is_tree(bin(leaf(1),bin(leaf(2),leaf(3))))。 % 测试 真的。 ?- T = bin(bin(leaf(1),2),_), is_tree(T)。 % 两者都做(或至少尝试) 错误的。 ?- T = bin(bin(leaf(1),leaf(2)),_), is_tree(T)。 % 两者都做 T = bin(bin(叶(1),叶(2)),叶(_A)) T = bin(bin(leaf(1),leaf(2)),bin(leaf(_A),leaf(_B))) T = bin(bin(叶子(1),叶子(2)),bin(叶子(_A),bin(叶子(_B),叶子(_C)))) ...

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

叶(叶(E))-> [E]。 叶子(bin(L,R))->叶子(L),叶子(R)。 相同内容(A,B):- 短语(叶子(A),Ls), 短语(叶子(B),Ls)。

示例查询:

?-same_content(bin(leaf(1),bin(leaf(2),leaf(3))), 仓(仓(叶(1),叶(2)),叶(3)))。 真的。

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

【讨论】:

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