【发布时间】:2012-03-17 16:22:36
【问题描述】:
我有一个表情,假设,
a = 1 && (b = 1 || b != 0 ) && (c >= 35 || d != 5) && (c >= 38 || d = 6)
我希望它减少到,
a = 1 && b != 0 && (c >= 38 || d = 6)
有人有什么建议吗?指向任何算法的指针?
Nota Bene: 我相信卡诺图或 Quine-McCluskey 不是这里的选择。因为这些方法不处理灰色情况。我的意思是,表达只能减少到像 A 或 A' 或什么都没有,或者说是黑色或白色或无色的情况。但是这里我有灰色阴影,你们可以看到。
解决方案:我已经在 Clojure 中为此编写了程序。我使用包含函数作为值的地图的地图。这很方便,只需几个组合的一些规则,你就很好。感谢您提供有用的答案。
【问题讨论】:
-
多项式时间内可以减少多少是有限制的。例如,如果您始终可以将任何合取范式表达式简化为最简单的形式,那么您将解决开放 3SAT 问题。
-
@mbeckish:这对我来说听起来很可怕。实际上,直到你们把我引向正确的方向,我才知道这些事情。我想到的不仅仅是 3SAT,还有 nSAT 问题。现在,这一切听起来都是不可能的。
-
不要害怕解决 NP 难题。对于他们中的大多数人来说,困难的部分将在问题空间的一个相对较小的区域内,处于不可行问题和简单问题之间的相变中。如果解决 NP 难题总是不可能的,我就会失业。这在很大程度上取决于您希望算法扩展多远。
标签: language-agnostic boolean-expression reduction boolean-operations constraint-programming