2013-01-04 16 views
5

Próbuję pobrać dane z mapy przy użyciu Clojure core.logic. Ten kod działa jak chcę go do:Wyodrębnianie elementów mapy z 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"]) 

Jednakże jeśli dodać kilka innych elementów do mapy to nie pasuje:

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

rozumiem dlaczego matcho nie działa jak mapach nie już tak samo. Moje pytanie brzmi: jak mogę to zmienić, aby działało ponownie? Jak mogę go dopasować tylko do niektórych kluczy na mapie lub w jaki sposób mogę go dopasować do dowolnych losowych kluczy, jakie może posiadać mapa?

EDIT:

Dostałem go do pracy przy użyciu patial-map (dzięki https://github.com/clojure/core.logic/pull/10)

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

Jednak znalazłem notatkę że featurec powinien być używany zamiast partial-map. Moje nowe pytanie: jak to zmienić, aby używać featurec?

+0

Dodałem treść kodu testowego, którego używałem: https://gist.github.com/4454548 –

Odpowiedz

6

Odpowiadając na moje własne pytanie:

Oto kod roboczych:

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

Ten kod pozwala mi wyodrębnić wartości z mapy ale tylko zwrócenie uwagi na klucze, które są naprawdę ważne. Pozostałe pary wartości klucza są ignorowane.

Powiązane problemy