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