如何格式化树以使其与Clojure的拉链一起使用?

时间:2010-10-11 00:21:06

标签: clojure tree genetic-programming zipper

我正在为遗传编程问题创建s表达式树,并且需要在进化过程中改变部分树。我遇到了似乎应该是完美的Clojure zipper函数,但对于我的生活,我无法弄清楚如何使用它。

例如,假设我使用

创建拉链
(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)

我很确定我正确地代表了我的树,因为当我执行它们时,我得到了正确的答案。拉链是否需要不同的布局?

2 个答案:

答案 0 :(得分:3)

问题在于树有两种不同的想法。您的树是一个图表,显示值在评估中如何渗透,但LISP正在考虑列表列表,并使用前缀表示法:

'(+( - 1 2)3)也是(list +(list - 1 2)3),实际上就是这棵树:

+  .     3
   - 1 2

(-> zipped down node)为您提供第一个元素+,一个原子。 (-> zipped down down)因此给你零,因为第一个元素+是一个原子。 (-> zipped down right down node)为您提供所需的减号,因为这是表达式第二个元素的第一个元素。

答案 1 :(得分:1)

树不是你如何描绘它的。根节点有3个子节点:+(- 1 2)3。当您从根节点执行down时,它默认为最左侧的子项,因此您会看到+

要访问-,您需要致电:

user=> (-> zipped zip/down zip/right zip/down zip/node)
clojure.core/-