1

我想[:b :B][[: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):

(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
4

1 回答 1

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)))
于 2018-01-24T11:16:05.700 回答