2013-01-04 10 views
5

से मानचित्र के तत्व निकालने का मैं क्लोजर core.logic का उपयोग करके मानचित्र से डेटा खींचने की कोशिश कर रहा हूं।क्लोजर 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 नक्शे के रूप में काम नहीं कर रहा कोई इस कोड मैं इसे करना चाहते हैं के रूप में करता है वही लंबा मेरा quesiton है, मैं इसे कैसे बदल सकता है ताकि यह फिर से काम करता है? मैं इसे मानचित्र में केवल कुछ कुंजियों पर मिलान करने के लिए कैसे प्राप्त करूं या मैप के किसी भी यादृच्छिक कुंजी से मेल खाने के लिए मैं इसे कैसे प्राप्त कर सकता हूं?

संपादित करें:

मैं (https://github.com/clojure/core.logic/pull/10 करने के लिए धन्यवाद) patial-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} 
        ]))) 

हालांकि मैं एक ध्यान दें कि featurecpartial-map के बजाय इस्तेमाल किया जाना चाहिए पाया। मेरा नया प्रश्न: featurec का उपयोग करने के लिए इसे कैसे बदला जाए?

+0

मैंने परीक्षण कोड का एक सारांश जोड़ा जो मैं उपयोग कर रहा था: https://gist.github.com/4454548 –

उत्तर

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} 
        ])))) 

इस कोड को मुझे एक नक्शे से मूल्यों लेकिन निकालने के लिए अनुमति देता है केवल कुंजी है कि वास्तव में महत्वपूर्ण हैं पर ध्यान दे:

यहाँ काम कर कोड है। शेष प्रमुख मूल्य जोड़े को अनदेखा कर दिया जाता है।