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 に答える