Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 使用core.logic进行重构_Clojure_Clojure Core.logic - Fatal编程技术网

Clojure 使用core.logic进行重构

Clojure 使用core.logic进行重构,clojure,clojure-core.logic,Clojure,Clojure Core.logic,我已经开始学习核心逻辑,我完全迷路了。我正在尝试编写一个core.logic关系来重构表达式,重命名符号。我想要一个返回给定表达式、符号列表和符号列表的关系,以重命名这些符号: (defn rename [exp from to]... 包含中所有符号的表达式将从中变为中的对应符号: e.g. (rename '(defn multiply [x y] (* x y)) [x y] [a b]) 返回(defn乘法[ab](*ab)) 但它需要注意范围 因此(重命名“(defn q[x](

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

(defn rename [exp from to]...
包含中所有符号的表达式将从中变为中的对应符号:

e.g. (rename '(defn multiply [x y] (* x y)) [x y] [a b]) 
返回
(defn乘法[ab](*ab))

但它需要注意范围

因此
(重命名“(defn q[x]((fn[x](*x 5))x))[x][a])

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


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

这个问题更适合于FP,因为它只是一个树遍历和替换操作,而as 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))

您是对解决问题更感兴趣,还是对使用core.logic来解决问题更感兴趣?我可以指出另一个解决方案。我可以从功能上做到这一点,但出于好奇,我想看看如何从关系上做到这一点——除非这是一种愚蠢的方式!欢迎提出任何建议。事实上,在core.logic中尝试了一些简单的练习之后,我仍然不知道如何以关系的方式处理这个问题(这是我正在写的东西需要解决的真正问题)。我觉得它看起来像是core.Logic的候选。这里有一些用于卫生转换的代码。更新它以重命名本地人并不难。这适用于完全宏扩展的表单。如果不进行全面的宏扩展,要让它正常工作几乎是不可能的。感谢代码——尽管我在Clojure工作了一年,它基本上是来自未来。必须学习宏。。。