Рассмотрим двоичное дерево:
- n - это узел, если n - это целое число
- (+ a b ) является узлом, если a и b являются узлами.
У нас есть следующие три операции:
- (+ a b ) -> (+ b a )
- (+ (+ a b ) c ) -> (+ a (+ b с ))
- (+ a (+ b c )) -> (+ (+ a b ) c ) - (2. в обратном порядке)
Мне нужен алгоритм для предоставления всех возможных перестановок данного дерева с помощью этих операций. Любая операция может быть применена к любому поддереву. Под перестановкой я подразумеваю любое дерево, которое имеет точно такой же набор листьев. Это, вероятно, не очень сложно, но я просто не могу понять это.
[Edit] Листья также могут быть именами (то есть переменными), поэтому полагаться на их свойства в виде целых чисел нельзя. Деревья представляют суммы.
[Edit2] Смысл этого упражнения в том, чтобы уменьшить сумму, найдя члены в форме A и -A , свернув дерево, чтобы превратить их в поддерево (+ A -A ), чтобы устранить их. Три операции, приведенные выше, являются аксиомами в моей системе, и их необходимо использовать полностью, иначе невозможно доказать, что уменьшенное дерево равно оригиналу. Поскольку я использую Twelf язык логического программирования, если мне удастся найти алгоритм для выполнения того, что я первоначально просил, остальное следует легко, но альтернативные решения, конечно, приветствуются.