考虑一个二叉树:
- n是一个节点,如果n是一个整数
- (+ a b ) 是一个节点,如果a和b是节点。
我们有以下三个操作:
- (+ a b ) -> (+ b a )
- (+ (+ a b ) c ) -> (+ a (+ b c ))
- (+ a (+ b c )) -> (+ (+ a b ) c ) -- (2. 反向)
我需要一种算法来使用这些操作给出给定树的所有可能排列。任何操作都可以应用于任何子树。对于排列,我的意思是任何具有完全相同的叶子的树。这可能不是很困难,但我似乎无法弄清楚。
[编辑]叶子也可以是名称(即变量),因此不能选择将它们的属性作为整数。树确实代表了总和。
[Edit2] 本练习的重点是通过查找A和-A形式的项来减少总和,将树调成子树 (+ A -A ) 以消除它们。上面这三个操作是我系统中的公理,需要一直用到,否则无法证明归约树与原树相等。由于我使用的是十二逻辑编程语言,如果我能找出一个算法来完成我最初提出的要求,其余的就很容易了,但当然欢迎替代解决方案。