如何从minikanren / clojure-core.logic中的一组可能值中进行选择?

时间:2012-08-03 18:42:49

标签: clojure scheme clojure-core.logic minikanren

如何表达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

1 个答案:

答案 0 :(得分:2)

(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))))
相关问题