【问题标题】:Simplify boolean expression algorithm简化布尔表达式算法
【发布时间】:2011-07-15 17:30:13
【问题描述】:

有人知道简化布尔表达式的算法吗?

我记得布尔代数和卡诺特映射,但这适用于 EVERITHING 为布尔值的数字硬件。我想要一些考虑到某些子表达式不是布尔值的东西。

例如:

a == 1 && a == 3

这可以翻译成纯布尔表达式:

a1 && a3 

但这是表达式是不可约的,而只要有一点算术知识,每个人都可以确定表达式是正确的:

false

有些人知道一些链接?

【问题讨论】:

  • 如果a 在语言/运行时被声明为允许这些变量/字段的易失性变量/字段,并且值在另一个线程上在 1 和 3 之间波动,该怎么办?我并不是说这是一个好的设计,但在软件中,“总是”和“从不”通常是相对的术语。
  • 这不是问题,实际使用的是 LINQ 提供程序,实际值是查询翻译时的值。如果他们再次执行查询,则将使用更新的值再次运行简化。
  • 一般情况下是不可能的。例如a > 0 and b > 0 and n > 2 and a^n + b^n = c^n 总是错误的,但它并不那么容易证明。这意味着您被临时简化所困扰,并且您的问题没有明确的答案(因为这取决于您可能会看到的表达式的性质)。
  • 你说得对,但因为这只是一个简化算法,我可以接受任何改进的算法,即使不是最好的解决方案。 mein 场景主要是枚举和引用类型的相等和不同的运算符。带有 == >= >

标签: algorithm boolean-logic boolean boolean-expression


【解决方案1】:

这是一个硬汉。我发现的最简单的算法是将每个输出组合与每个输入组合匹配。但这是基本算法,并没有解决每个表达式。

如果所有输出 (q1,q2,q3,q4) 与 for 相同,即输入 A 组合,则化简结果为 A。

如果没有,您将尝试另一个变量/输入依赖项。

【讨论】:

    【解决方案2】:

    这个问题有两个部分,逻辑简化和表示简化。

    为了简化逻辑,Quine-McCluskey。为了简化表示,使用分布恒等式递归提取术语 (0&1|0&2) == 0&(1|2)。

    我详细介绍了过程here。这给出了仅使用 & 和 | 的解释,但可以对其进行修改以包含所有布尔运算符。

    【讨论】:

      【解决方案3】:

      您可能对K-mapsQuine–McCluskey algorithm 感兴趣。

      我认为 SymPy 能够解决和简化布尔表达式,查看源代码可能会有用。

      【讨论】:

        【解决方案4】:

        您的特定示例将由SMT solver 解决。 (它会确定没有任何变量设置可以使表达式为真;因此它始终为假。更一般的简化超出了此类求解器的范围。)显示表达式等效于 truefalse 是当然,即使没有将算术纳入交易,NP-hard 也是如此,所以即使有这么多的实用软件也是非常酷的。取决于有多少算术知识在范围内,问题may be undecidable

        【讨论】:

          【解决方案5】:

          可能的不同值的数量是有限且已知的吗?如果是这样,您可以将每个表达式转换为布尔表达式。例如,如果 a 有 3 个不同的值,那么您可以有变量 a1a2a3,其中 a1 为真意味着 a == 1 等。一旦你这样做了,你可以依赖 Quine- McCluskey 算法(对于较大的示例可能比卡诺图更好)。这是 Quine-McCluskey 的一些 Java code

          我不能说这种设计是否真的会简化事情或使事情变得更复杂,但你可能至少要考虑一下。

          【讨论】:

          • 完全正确!,这就是我的意思,但这样的算法将不知道,在我的示例中,a1 && a3 实际上是错误的。因为 a 不能同时是 1 和 3。我认为我需要将值绑定到变量并在卡诺特最小术语中找到矛盾。
          【解决方案6】:

          第一次使用谷歌发现这篇论文:

          http://hopper.unco.edu/KARNAUGH/Algorithm.html

          当然,这不涉及非布尔子表达式。但是一般形式的后半部分确实很难,因为绝对没有算法来检查任意算术表达式是真、假还是什么。您所要求的内容深入到compiler optimization 的领域。

          【讨论】:

          • 我之前也在看论文,但我也发现它很不详细,没有提供代码。
          猜你喜欢
          • 2016-06-30
          • 2016-07-13
          • 2016-02-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多