私はclojureとcore.logicをどのようにミックスするかについて頭を悩ましています。例えばClojureの大きなプログラムでは、core.logicを実用的な方法でどのように使用しますか?
は、私は次のような問題を持っていると言う:
私は付属のスコアがキーと値のペアのリストを持っている:
(:foo "10" 2)
(:bar "20" 3)
(:baz "30" 7)
をそして私はまた、マップを持っている:
{:foo "10",
:bar "42",
:baz "30"}
私がしたいことは、地図の点で評価されたスコアのリストに基づいて得点のリストを返すことです。私はこのような何かを行うことができ、コア・ロジックを使用して
:
(defrel score key value score)
(fact score :foo "10" 2)
(fact score :bar "20" 3)
(fact score :baz "30" 7)
(run* [q]
(conde
((score :foo "10" q))
((score :baz "30" q))))
そして、私は意図した結果を得る:
(2 7)
を私の問題は、私はその何かにこれを有効にする方法を見ていないです私は大きなプログラムを動的に実行することができます。異なる時期に適用するために、私は異なる地図と異なる制約を持つことを意味します。私はマップをとり、制約を出力する関数を書くことで、condeに引数をつけることができると思いますが、実行するにはどうすればいいですか? 一時的な事実の集合の中で評価しますか?
core.logicを使用せずに私が望むものを返す関数を作成することはできますが、それほどエレガントではありません。たぶん私は間違ったツリー(私はClojureとcore.logicの両方に新しい)を吠えているかもしれません。これは制約の問題ではありません。
だから私の質問は以下のとおりです。あなたが実行時まで知ることができませんソースからのあなたの事実と制約を引いているとき
はどのようにして、コア・ロジックに混ぜていますか?
関連する新しい環境のファクト内で一連の制約を評価する環境ではどうしますか?
大変ありがとうございます。これは正しい道で私を止めてしまった。私はマクロを使って作業する必要がありますが、これは多くの助けになるはずです。core.logicは私が解決したい問題の正しい解決策です。 – jgerman
APIを使用してcore.logicを拡張する例もwikiを参照してくださいhttps://github.com/clojure/core.logic/wiki/Extending-core.logic-%28Datomic-example%29 –