二分木を考えてみましょう:
- nが整数の場合、 nはノードです
- aとbがノードの場合、 (+ a b ) はノードです。
次の 3 つの操作があります。
- (+ a b ) -> (+ b a )
- (+ (+ a b ) c ) -> (+ a (+ b c ))
- (+ a (+ b c )) -> (+ (+ a b ) c ) -- (2.逆)
これらの操作を使用して、特定のツリーの可能な順列をすべて与えるアルゴリズムが必要です。任意の操作を任意のサブツリーに適用できます。順列とは、まったく同じ葉のセットを持つすべての木を意味します。そんなに難しいことではないのかもしれませんが、私には理解できないようです。
[編集] リーフは名前 (つまり変数) にすることもできるため、整数としてのプロパティに依存することはオプションではありません。木は合計を表します。
[編集 2] この演習のポイントは、フォームAおよび-Aの項を見つけて合計を減らし、それらを削除するためにツリーをサブツリー (+ A -A ) に取得することです。上記の 3 つの操作は私のシステムの公理であり、最後まで使用する必要があります。そうしないと、削減されたツリーが元のツリーと等しいことを証明できません。私はTwelfロジック プログラミング言語を使用しているので、最初に要求したことを実行するアルゴリズムを理解できれば、残りは簡単に実行できますが、別の解決策ももちろん歓迎します。