请在Clojure 2024 状态调查!中分享您的看法。

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

+1
Clojure

我正在尝试使用 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

被选择
 
最佳答案
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])
...