【问题标题】:How to select from a set of possible values in minikanren / clojure-core.logic?如何从 minikanren / clojure-core.logic 中的一组可能值中进行选择?
【发布时间】:2012-08-03 18:42:48
【问题描述】:

如何表达n 变量从一组n 值中获取不同值的约束?

例如,也许我想搜索表单的表达式

(op1 a (op2 b c))

具有最大值时,a、b 和 c 应该是 1、2 和 3(按某种顺序),而 op1 和 op2 都可以是 * + - / exp 中的任何值?

我可以看到如何使a 具有来自1 2 3 的值(例如使用conde)。 bc 也是如此。但是那我如何排除平等呢?我是否需要遍历所有组合并明确排除它们?

显然我可以“手动”进行排除,但我想知道是否有更好(更有效)的方法,或者包含此类内容的支持库(我对线性编程库和通常他们有一堆帮助函数来解决这些常见的情况)。

将其推广到某些值可以出现一定次数的情况似乎会很麻烦......

现在我想一想,如何搜索最大值?有没有这方面的好书或笔记?!

[我正在使用 clojure,但我的理解是 clojure-core.logic 和 minikanren 几乎相同]

更新:任何阅读此问题的人都在寻找好的介绍,请查看我在下面的评论中提到的Alvis paper

【问题讨论】:

    标签: clojure scheme clojure-core.logic minikanren


    【解决方案1】:
    (run* [q] 
      (fresh [a b c]
        (== q [a b c])
        (fresh [x y z]
          (rembero a '(* + / - exp) x)
          (rembero b x y)
          (rembero c y z))))
    

    【讨论】:

    • 啊哈。所以 clojure-core 包含 cKaren 扩展 - schemeworkshop.org/2011/papers/Alvis2011.pdf(我应该更仔细地阅读文档)。谢谢!
    • 是什么让你认为这是一个 cKanren 扩展? rembero 是 TRS 中定义的关系,最近为了方便起见,将其添加到 core.logic 中。
    • github.com/clojure/core.logic(提到 cKanren)和 schemeworkshop.org/2011/papers/Alvis2011.pdf(描述 cKanren 并提到 rembero);如果这不正确,我还缺少其他文档吗?
    • 好的,现在我已经阅读了论文,你是对的,它指的是 trs。对于其他阅读本文的人来说,ckanren 似乎确实在 clojure-core.logic 中,但有些东西已被重命名。例如,all-difffd 是differfd。
    猜你喜欢
    • 2015-08-14
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多