0

我已经开始学习 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))

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

4

1 回答 1

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))
于 2013-03-03T09:10:30.280 回答