1

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

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

(op1 a (op2 b c))

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

我可以看到如何a从(例如1 2 3通过使用)中获得价值。conde和 也是b如此c。但是那我如何排除平等呢?我是否需要遍历所有组合并明确排除它们?

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

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

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

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

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

4

1 回答 1

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))))
于 2012-08-03T20:14:22.027 回答