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中为此编写了程序.我使用了包含函数值的地图.这非常方便,只是几个组合的一些规则,你很好.谢谢你的有用答案.
我认为您应该能够通过使用Constraint Handling Rules来实现您想要的目标。您需要编写简化 OR 和 AND 表达式的规则。
主要的困难是约束蕴涵检查,它告诉您可以删除哪些部分。例如, (c >= 35 || d != 5) && (c >= 38 || d = 6) 简化为 (c >= 38 || d = 6) 因为前者是由后者蕴含的,即后者更为具体。不过,对于 OR 表达式,您需要选择更通用的部分。
Google 发现了一篇关于 CHR 扩展的论文,其中包含用户定义约束的蕴涵检查。我对 CHR 的了解不够,无法告诉您是否需要这样的延期。