【问题标题】:How can I remove [:b (lvar)] from [[:a :A] [:b :B] [:c :C]] in Clojure core.logic?如何从 Clojure core.logic 中的 [[:a :A] [:b :B] [:c :C]] 中删除 [:b (lvar)]?
【发布时间】:2016-04-08 20:44:10
【问题描述】:

我想在以下示例代码中从[[:a :A] [:b :B] [:c :C]] 中删除[:b :B],如果我将: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

【问题讨论】:

    标签: clojure logic clojure-core.logic


    【解决方案1】:

    我相信这在您的示例中不起作用的原因是创建的 (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)))
    

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 2015-06-12
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多