2016-04-08 32 views
1

Aşağıdaki örnek kodda [[:a :A] [:b :B] [:c :C]] den [:b :B] kaldırmak istiyorum, ve (lvar) ile :B değiştirirseniz, artık çalışır:[: b (lvar)] 'ı Clojure core.logic dosyasındaki [[: a: A] [: b: B] [: c: C]] sayfasından nasıl kaldırabilirim?

;; Helper Function 
(defne not-membero [x l] 
    ([_ []]) 
    ([_ [?y . ?r]] 
    (!= x ?y) 
    (not-membero x ?r))) 

Bu çalışma:

(run* [q] 
    (membero q [[:a :A] [:b :B] [:c :C]]) 
    (not-membero q [[:b :B]])) 
(run* [q] 
    (membero q [[:a :A] [:b :B] [:c :C]]) 
    (!= q [:b :B])) 
;; both return [[:a :A] [:c :C]], as expected 

Bunlar yok (haber lvar):

(run* [q] 
    (membero q [[:a :A] [:b :B] [:c :C]]) 
    (not-membero q [[:b (lvar)]])) 
(run* [q] 
    (membero q [[:a :A] [:b :B] [:c :C]]) 
    (!= q [:b (lvar)])) 
;; both return [[:a :A] [:b :B] [:c :C]], unexpected 

cevap

0

Bunun nedenini inanıyorum ' Örneğinizde çalışmanız, oluşturulan (lvar)'un programdaki diğer mantık değişkenleriyle ilişkisiz/ilişkisiz olmasıdır.

: Alternatif

(run* [q] 
    (fresh [x] 
    (membero q [[:a :A] [:b x] [:c :C]]) 
    (not-membero q [[:b x]]))) 
=> ([:a :A] [:c :C]) 
(run* [q] 
    (fresh [x] 
    (membero q [[:a :A] [:b x] [:c :C]]) 
    (!= q [:b x]))) 
=> ([:a :A] [:c :C]) 

, bu demet içinde :b öğenin bilgisi olmadan aynı sonuç: Bir fresh mantık değişkeni kullanırsanız Programınız (en azından ben istediğinin bu olduğunu düşünüyorum) gayet iyi çalışıyor

(run* [q] 
    (fresh [x] 
    (membero q [[:a :A] x [:c :C]]) 
    (not-membero q [x]))) 
(run* [q] 
    (fresh [x] 
    (membero q [[:a :A] x [:c :C]]) 
    (!= q x)))