使用core.logic进行重构

时间:2013-03-03 04:02:37

标签: clojure clojure-core.logic

我开始学习core.logic而且我完全迷失了。我正在尝试编写一个core.logic关系,它重构一个表达式,重命名符号。我想要一个为给定表达式返回的关系,符号列表和一个符号列表来重命名这些符号:

(defn rename [exp from to]...

表达式中包含的所有符号成为相应的符号:

e.g. (rename '(defn multiply [x y] (* x y)) [x y] [a b]) 

返回(defn multiply [a b] (* a b))

但需要注意范围,

所以(rename '(defn q [x] ((fn [x] (* x 5)) x)) [x] [a])

会返回(defn q [a] ((fn [x] (* x 5)) a))

我不知道从哪里开始解决这个问题 - 任何提示都会非常感激!

1 个答案:

答案 0 :(得分:2)

这个问题更适合FP,因为它只是一个树遍历和替换操作,其中LP更多的是指定约束并询问围绕这些约束的所有可能解决方案的特定输入。但是如果你真的想以这种逻辑的方式做到这一点,我尝试了一些尝试以LP方式做到的事情,但是它并没有处理很多情况而只是一个起点。

(defrel replace-with a b)
(fact replace-with 'x 'a)
(fact replace-with 'y 'b)

(defn replace [a b]
   (conde
    [(replace-with a b)]
    [(== a b)]))


(defn replace-list [from to]
  (conde 
   [(== from []) (== to [])]
   [(fresh [f t f-rest t-rest]
            (resto from f-rest)
            (resto to t-rest)
            (firsto from f) (firsto to t)  
            (conda [(replace-list f t)]
                   [(replace f t)])
            (replace-list f-rest t-rest))]))


(first (run 1 [q]
        (fresh [from]
        (== from '(defn multiply [x y] (* x y)))
        (replace-list from q))))

==> (defn multiply (a b) (* a b))