1

我在这个简单的关系上苦苦挣扎,结果不完整,我不明白为什么。

我从 core.logic 开始我不知道这是一个错误还是我对它的理解不好。

(require '[clojure.core.logic :as l])
(require '[clojure.core.logic.fd :as fd])

(defn zip+o [x y z]
  (l/conde
    [(l/== () x) (l/== () y) (l/== () z)]
    [(l/fresh [fx rx fy ry fz rz]
              (l/conso fx rx x)
              (l/conso fy ry y)
              (l/conso fz rz z)
              (fd/in fx fy fz (fd/interval 10))
              (fd/+ fx fy fz)
              (zip+o rx ry rz))]))

; the same with defne macro
(comment
  (l/defne zip+o [x y z]
           ([() () ()])
           ([[fx . rx]
             [fy . ry]
             [fz . rz]]
             (fd/in fx fy fz (fd/interval 10))
             (fd/+ fx fy fz)
             (zip+o rx ry rz))))

(def expected-solutions
  #{{:x [0 0] :y [1 1]}
    {:x [0 1] :y [1 0]}
    {:x [1 1] :y [0 0]}
    {:x [1 0] :y [0 1]}})

(l/run* [q]
        (l/fresh [x y]
                 (l/== q {:x x :y y})
                 (zip+o x y [1 1])))

;=> ({:x (1 0), :y (0 1)}
;    {:x (0 0), :y (1 1)})
4

0 回答 0