6

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ですか?

4

1 に答える 1

6

私自身の質問に答える:

作業コードは次のとおりです。

(run 10 [q] 
   (fresh [?id ?type ?name ?pm] 
          (membero ?type [:t2 :t1])
          (== q [?id ?name])
          (featurec ?pm  {:id ?id :type ?type :name ?name} )
          (membero ?pm
                   [
                    {:id 1 :type :t1 :name "one" :other1 :o2}
                    {:id 2 :type :t2 :name "two" :other2 :o1 :another :ao2}
                    {:id 3 :type :t3 :name "three" :other2 :o1 :another :ao1}
                    ]))))

このコードを使用すると、マップから値を抽出できますが、本当に重要なキーだけに注意を払うことができます。残りのキーと値のペアは無視されます。

于 2013-01-04T17:18:00.853 に答える