2013-01-04 34 views
5

Tôi đang cố gắng lấy dữ liệu ra khỏi bản đồ bằng cách sử dụng Clojure core.logic. Mã này không như tôi muốn nó:Trích xuất các yếu tố của bản đồ từ 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"]) 

Tuy nhiên nếu tôi thêm một số yếu tố khác để bản đồ sau đó nó không phù hợp:

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

Tôi hiểu tại sao matcho không được làm việc như các bản đồ không dài hơn như nhau. Quesiton của tôi là, làm thế nào tôi có thể thay đổi điều này để nó hoạt động trở lại? Làm thế nào để tôi làm cho nó khớp với một số phím trong bản đồ hoặc làm thế nào tôi có thể làm cho nó khớp với bất kỳ khóa ngẫu nhiên nào mà bản đồ có thể có?

EDIT:

tôi đã nhận nó để làm việc bằng patial-map (nhờ 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} 
        ]))) 

Tuy nhiên tôi thấy một lưu ý rằng featurec nên được sử dụng thay vì partial-map. Câu hỏi mới của tôi: Làm thế nào để thay đổi điều này để sử dụng featurec?

+0

Tôi đã thêm một Gist của mã thử nghiệm mà tôi đã sử dụng: https://gist.github.com/4454548 –

Trả lời

6

Trả lời câu hỏi của riêng tôi:

Dưới đây là đoạn code làm việc:

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

Mã này cho phép tôi để trích xuất giá trị từ một bản đồ mà chỉ chú ý đến các phím có thực sự quan trọng. Phần còn lại của cặp giá trị khóa được bỏ qua.

Các vấn đề liên quan