【问题标题】:How to convert formula to CNF? [closed]如何将公式转换为 CNF? [关闭]
【发布时间】:2015-07-21 02:05:49
【问题描述】:

我知道将公式转换为 CNF 的 4 条规则,但我不太确定如何将它们应用于此公式 ((x v y) ^ ¬ z) ->w

有人可以帮我解释一下吗?谢谢!

【问题讨论】:

  • 您的问题到底是什么?或者你在哪里卡住了?也许这会有所帮助:A -> B 等价于 not A and B
  • 好吧,如果我没有错,第一步就是做 ¬((X v Y) ^ ¬Z) v W(我想就是这样......但我不知道我是否' m 应该移动 not 在一个或两个括号中,或者如果它是两个单独的步骤)
  • 你能描述一下你的算法吗?你想要一个最小长度的公式吗?或者只是任何CNF?我们需要更多信息才能为您提供帮助。
  • 这个问题似乎与编程无关。也许在math.stackexchange.com 上更合适?

标签: formula boolean-logic conjunctive-normal-form


【解决方案1】:

将表达式转换为CNF的方法
将公式转换为 CNF 的一种方法是:

  1. 写一个truth table(仅当公式计算结果为假时,这些术语才相关)
  2. 在truth table 的每个术语中反转所有文字
  3. 将生成的术语作为CNF 子句

这个秘方可以通过以下方式合理化:
除非整个表达式为假,否则任何子句都不得为假。因此,每个子句都表示倒置表达式的一个最小项。为确保该术语为假,所有反转文字都不能为真。

对于 n 个输入变量,真值表有 2^n 个项。因此,这种方法只适用于小表达式。

用您的示例公式演示这些步骤

((x or y) 而不是 z) 暗示 w

真值表(F = 表达式值):

wxyz|F
----+-
0000|1
1000|1
0100|0
1100|1
0010|0
1010|1
0110|0
1110|1
0001|1
1001|1
0101|1
1101|1
0011|1
1011|1
0111|1
1111|1
----+-

假项(F = 0):

wxyz|F
----+-
0100|0
0010|0
0110|0
----+-

文字反转,输出列省略:

wxyz
----
1011
1101
1001
----

产生的CNF 子句:

(w or !x or y or z) and (w or x or !y or z) and (w or !x or !y or z)

通过合并子句最小化生成的CNF子句:

(w or !x or z) and (w or !y or z)

如有疑问,可以咨询Wolfram|Alpha。

从Karnaugh map 中,可以清楚地看出三个虚假术语如何合并为两个子句:

             wx
       00  01  11  10
      +---+---+---+---+
   00 | 1 | 0 | 1 | 1 |
      +---+---+---+---+
   01 | 1 | 1 | 1 | 1 |
yz    +---+---+---+---+
   11 | 1 | 1 | 1 | 1 |
      +---+---+---+---+
   10 | 0 | 0 | 1 | 1 |
      +---+---+---+---+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多