2016-04-08 9 views
1

私は次のコード例では[[:a :A] [:b :B] [:c :C]]から[:b :B]を削除したいない、と私は(lvar):Bを交換した場合、それはもはや作品:Clojure core.logicの[:a:A] [:b:B] [:c:C]]から[:b(lvar)]を削除するにはどうしたらいいですか?

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

これらの作業:

(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 

これらの(ないの通知lvar):これは「doesnの

(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 

答えて

0

私は信じている理由あなたの例では、作成された(lvar)は、プログラム内の他のロジック変数とは無関係/無関係です。あなたはfresh、論理変数を使用する場合は、あなたのプログラムは、(少なくとも私はこれがあなたが望んだと思います)正常に動作します:

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

また、これらはタプルの:b項目の知識がなくても同じ結果を返す:

(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))) 
関連する問題