减少布尔表达式

Ade*_*ari 6 language-agnostic boolean-expression constraint-programming reduction boolean-operations

我有一个表达,假设,

a = 1 && (b = 1 || b != 0 ) && (c >= 35 || d != 5) && (c >= 38 || d = 6)
Run Code Online (Sandbox Code Playgroud)

我希望它减少到,

a = 1 && b != 0 && (c >= 38 || d = 6)
Run Code Online (Sandbox Code Playgroud)

有没有人有什么建议?指向任何算法的指针?

Nota Bene:我相信Karnaugh Map或Quine-McCluskey不是一个选择.由于这些方法不处理灰色案例.我的意思是,表达只能减少,就像A或A'或任何东西,或说黑色或白色或缺乏颜色.但是在这里,我有灰色阴影,正如大家们所看到的那样.

解决方案:我已经在Clojure中为此编写了程序.我使用了包含函数值的地图.这非常方便,只是几个组合的一些规则,你很好.谢谢你的有用答案.

twi*_*rer 2

我认为您应该能够通过使用Constraint Handling Rules来实现您想要的目标。您需要编写简化 OR 和 AND 表达式的规则。

主要的困难是约束蕴涵检查,它告诉您可以删除哪些部分。例如, (c >= 35 || d != 5) && (c >= 38 || d = 6) 简化为 (c >= 38 || d = 6) 因为前者是由后者蕴含的,即后者更为具体。不过,对于 OR 表达式,您需要选择更通用的部分。

Google 发现了一篇关于 CHR 扩展的论文,其中包含用户定义约束的蕴涵检查。我对 CHR 的了解不够,无法告诉您是否需要这样的延期。