首页 > 解决方案 > 约束 core.logic 查询的结果?

问题描述

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

标签: graphclojureclojure-core.logic

解决方案


假设您不关心您得到的两个结果中的哪一个,那么最简单的做法是将 (run* [q] 调用替换为 (run 1 [q],其中 1 表示您只希望返回一个结果。


推荐阅读