2024 年 Clojure 状况调查中分享您的想法!

欢迎!请参阅关于页面,了解更多有关此工作方式的信息。

+1
in Clojure by

我正在尝试使用 core.logic 建模一个图,并希望匹配所有有两个节点的边的节点。我已经想出了以下方法,但它返回了两个结果,即 [2 3 4] 和 [2 4 3] 是等效的。我该如何约束查询只返回期望的结果?

(use ' clojure.core.logic.pldb)

(db-rel edge a b)

(def g
  (db
   [edge 1 2]
   [edge 2 3]
   [edge 3 4]
   [edge 2 4]))

(with-db g
  (run* [q]
    (fresh [x y z]
      (edge x y)
      (edge x z)
      (!= y z)
      (== q [x y z]))))

1 答案

+1
by
selected by
 
最佳答案
user> (require '[clojure.core.logic.fd :as fd])
nil
user> (with-db g
  (run* [q]
    (fresh [x y z]
      (fd/in x y z (fd/interval 1 5))
      (edge x y)
      (edge x z)
      (fd/< y z)
      (== q [x y z]))))
([2 3 4])
...