Refactoring with core.logic



我已经开始学习core了。逻辑,我完全迷路了。我在试着写一个核心。重构表达式,重命名符号的逻辑关系。我想要一个关系,它返回一个给定表达式,符号列表和一个符号列表来重命名这些符号:

(defn rename [exp from to]...

所有in中的符号变为对应的in中的符号的表达式:

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

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

但是它需要知道作用域,

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

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

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

这个问题更适合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))

相关内容

  • 没有找到相关文章

最新更新