【问题标题】:Simplification of boolean formulas without negation, just and/or没有否定的布尔公式的简化,只是和/或
【发布时间】:2010-11-09 23:22:47
【问题描述】:

我想预处理布尔公式,以便 a and (a or b) and c

变得只是 a和c

从来没有任何否定,所以它应该是一个简单的问题,但没有什么真正明显的想法出现在脑海中(除了折叠和-in-and、or-in-or、重复项、排序)。我是否遗漏了一些非常明显的东西?

【问题讨论】:

  • (a 和 b)或(a 和 c)或(b 和 c)应该变成什么?有什么不一样的吗?
  • 不幸的是,没有更简单的方法来表达多数 (a,b,c) - 这是电路设计中众所周知的问题。
  • 一些答案​​已经为您提供了布尔简化。你还没有接受答案,你的cmets让我觉得我们可能不太理解这个问题??是这样吗?

标签: math logic boolean


【解决方案1】:

我有一个关于 CSTheory.stackexchange 的相关问题,答案是否定的 here

您描述的问题是复杂的。因此,除非 P=NP,否则您将找不到有效的算法来做到这一点。

转换为 CNF 或 DNF 会导致某些公式呈指数级增长。

【讨论】:

    【解决方案2】:

    从您的示例中,您通常并不清楚您想要什么。

    看来你想用absorption laws尽可能简化公式:

    A ∨ (A ∧ B) = A 
    
    A ∧ (A ∨ B) = A 
    

    在您的示例中,您只需应用第二吸收定律一次。

    【讨论】:

      【解决方案3】:

      A(A+B)C

      AAC + ABC

      AC + ABC

      A1C + ABC

      A(1+B)C

      A(1)C

      交流

      这就是你要找的吗?

      【讨论】:

      • 扩展会可靠地简化它吗?它显然可以在找出它到处都是重复之前以指数方式炸毁它,并且应该有一些方法可以利用缺乏否定的优势(否则它是 NP 完全的)。
      【解决方案4】:

      使用K-map

      基本上,您将在内存中创建公式可能结果的图表。解析它,并以给定所有变量的任意输入的方式存储它,您可以获得结果。然后创建一个 N 维数组(其中 N 是变量的数量)并尝试每种组合,将结果存储在数组中。

      完成此操作后,请按照上述文章中的步骤得出一个简化的表达式。

      请注意,这适用于包含所有类型的布尔运算符的表达式,包括 not。

      【讨论】:

      • 包含 NOT 通过简单地简化为 SAT 简化或不为 false 使问题成为 NP-Complete。我不认为这是这种方式,有时公式中有大量的术语。
      • 这是一种的方式。 K-maps 能够将任意复杂的布尔表达式简化为最简单的形式。因此,它适用于任何输入,假设您能够为您的目的足够快地计算结果。 (每个额外的变量应该大约是生成真值表所需的计算能力的两倍。即使是几百个变量,这在今天的处理器上也应该花费很少的时间。)
      【解决方案5】:

      考虑转换为CNFDNF

      简化“底层”很容易——只需删除重复项即可。简化下一级几乎同样容易——删除子集或超集。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-15
        • 2020-02-12
        • 2011-08-16
        • 2017-05-08
        • 2012-06-30
        • 1970-01-01
        • 2016-07-13
        • 2016-02-20
        相关资源
        最近更新 更多