1

我在训练 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,它产生一个元素列表,因为它们在第一个参数中以从左到右的顺序在树的叶子中找到!

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

希望能得到任何擅长prolog的人可以帮助我,非常感谢。

4

1 回答 1

2

两者tree/1leaf/1都是默认1 ,2!为什么不使用像这样更清晰的表示?

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

注意:

  • is_tree/1tree/1and更通用leaf/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:这篇关于 Prolog 教学的坚如磐石的论文讨论了许多常见的障碍,包括违约
脚注 2:这个答案中,@mat 解释了 Prolog 中的默认性如何阻碍声明性调试和推理。

于 2015-10-27T18:37:02.160 回答