3

遺伝的プログラミングの問題のために s 式のツリーを作成していますが、進化の過程でツリーの一部を変更する必要があります。完璧なClojureのジッパー機能に出会いましたが、私の人生では使い方がわかりません。

たとえば、ジッパーを作成するとします

(def zipped (zip/seq-zip `(+ (- 1 2) 3)))

これは、ルートに + があるツリーを表していると理解しています。次のようなものです。

   +
 -   3
1 2

ただし、私のジッパーはこれに同意しません。最初のノードを要求すると、(-> zipped zip/down zip/node)(+正しい) が返されますが、 に(-> zipped zip/down zip/down)移動せず-、代わりに が返されますnil。確かに(-> zipped zip/down zip/rights)、ツリーの残りの部分をルートの右側に兄弟として与えます。これは、ツリーがまったくないことを示唆しています。

user> (-> zipped zip/down zip/rights)
((clojure.core/- 1 2) 3)

ツリーを実行すると正しい答えが得られるため、ツリーを正しく表現していると確信しています。ジッパーは別のレイアウトを期待していますか?

4

2 に答える 2

3

問題は、ここで行われているツリーの 2 つの異なるアイデアがあることです。あなたのツリーは、評価を通じて値がどのように浸透するかを示すグラフですが、LISP はリストのリストについて考えており、プレフィックス表記を使用しています。

'(+ (- 1 2) 3) は (list + (list - 1 2) 3) でもあり、これは実際には次のツリーです。

+  .     3
   - 1 2

(-> zipped down node)最初の要素 + であるアトムが得られます。 (-> zipped down down)したがって、最初の要素 + がアトムであるため、nil が返されます。 (-> zipped down right down node)式の 2 番目の要素の最初の要素であるため、必要なマイナス記号が得られます。

于 2010-10-11T00:51:38.300 に答える
1

ツリーは、あなたが図解した方法ではありません。ルート ノードには、 、 、および の 3 つの子が+あり(- 1 2)ます3。ルート ノードから実行するdownと、デフォルトで一番左の子になるため、 が表示されます+

にアクセスするには、次の-ように電話する必要があります。

user=> (-> zip zip/down zip/right zip/down zip/node)
clojure.core/-
于 2010-10-11T00:51:07.593 に答える