【问题标题】:Constrain results from core.logic query?约束 core.logic 查询的结果?
【发布时间】:2020-04-16 22:02:35
【问题描述】:

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

【问题讨论】:

    标签: graph clojure clojure-core.logic


    【解决方案1】:

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

    【讨论】:

    • 是的,考虑过这一点,但这不起作用,因为查询可能会返回多个真正的命中,即。多个具有“后代”的节点。
    • 如果你的立场是你得到了正确的答案,但也有一些在某种程度上是错误的答案,最简单(也是最正确)的事情是在你的查询中添加过滤条件去掉那些你不想要的结果。
    • 是的,我想我无法弄清楚这些约束应该是什么。建议的答案可能有效,但这只是表达 3-2-4 子图和 4-2-3 子图等价的一种奇怪方式。
    • 在您的示例中,两种解决方案都是正确的,因为它们都是查询“哪些节点与(至少)其他两个节点有边?”的解决方案
    • 我认为你想要的是找出哪些节点与(至少)两个其他节点有边,然后返回一组不同的节点。在这种情况下,您可以通过(进入#{}(首先映射您的结果))运行查询结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多