Clojure core.logic を使用してマップからデータを取得しようとしています。このコードは、私が望むように動作します:
(run 10 [q]
(fresh [?id ?type ?name]
(membero ?type [:t2 :t1])
(== q [?id ?name])
(membero {:id ?id :type ?type :name ?name}
[
{:id 1 :type :t1 :name "one"}
{:id 2 :type :t2 :name "two"}
])))
=> ([2 "two"] [1 "one"])
ただし、他の要素をマップに追加すると、一致しなくなります。
(run 10 [q]
(fresh [?id ?type ?name]
(membero ?type [:t2 :t1])
(== q [?id ?name])
(membero {:id ?id :type ?type :name ?name}
[
{:id 1 :type :t1 :name "one" :other1 :o1}
{:id 2 :type :t2 :name "two" :other2 :o2}
])))
matcho
マップが同じではなくなったため、機能しない理由を理解しています。私の質問は、これを再び機能させるにはどうすればよいですか? マップ内の一部のキーのみに一致させるにはどうすればよいですか、またはマップにある可能性のあるランダムなキーに一致させるにはどうすればよいですか?
編集:
私はそれを使って動作させました( https://github.com/clojure/core.logic/pull/10patial-map
に感謝します)
(run 10 [q]
(fresh [?id ?type ?name]
(membero ?type [:t2 :t1])
(== q [?id ?name])
(membero (partial-map {:id ?id :type ?type :name ?name} )
[
{:id 1 :type :t1 :name "one" :other1 :o2}
{:id 2 :type :t2 :name "two" :other2 :o1}
])))
ただし、featurec
代わりに使用する必要があるメモを見つけましたpartial-map
。私の新しい質問:これを使用するように変更するにはどうすればよいfeaturec
ですか?