2013-01-04 13 views
5

Sto cercando di estrarre i dati da una mappa utilizzando Clojure core.logic. Questo codice fa come voglio che:Estrazione di elementi di una mappa da 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"]) 

Tuttavia, se aggiungo alcuni altri elementi alla mappa poi non riesce a corrispondere:

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

capisco perché matcho non funziona come le mappe non più lungo lo stesso. Il mio quesiton è, come posso cambiare questo in modo che funzioni di nuovo? Come faccio a farlo corrispondere solo su alcuni dei tasti di una mappa o come posso farlo per abbinare qualsiasi chiave casuale che una mappa può avere?

EDIT:

ho preso a lavorare con patial-map (grazie a 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} 
        ]))) 

Tuttavia ho trovato una nota che featurec dovrebbe essere usato al posto di partial-map. La mia nuova domanda: come cambiarlo per usare featurec?

+0

Ho aggiunto un Gist del codice di prova che stavo usando: https://gist.github.com/4454548 –

risposta

6

Rispondendo alla mia domanda:

Ecco il codice di lavoro:

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

Questo codice mi permette di estrarre valori da una mappa, ma solo prestando attenzione alle chiavi che sono veramente importanti. Il resto delle coppie di valori chiave viene ignorato.