压缩正DNF

时间:2012-09-05 15:29:01

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

我想压缩正面命题公式 析取范式(DNF)。

我现在只假设简单的DNF而没有否定 文字。相反的过程,减压可以很容易 定义。对于仅由连接和分离构建的公式, 以下重写规则将生成DNF:

A & (B v C) --> (A & B) v (A & C)
(A v B) & C --> (A & C) v (B & C)

以下是解压缩示例:

Example: Decompression
Input:
  (p & (q v r) & s & (t v u)) v
  w.

Output:
  (p & q & s & t) v
  (p & r & s & t) v
  (p & q & s & u) v
  (p & r & s & u) v
  w.

现在我想知道是否有一些算法 这可以从DNF生成单个公式。 我已经研究过二元决策图。该 我遇到的问题是他们无法结合 所有的分离都在路上。

例如二进制决策图的算法 使用共享,仍然会显示类似的分支 打印和/或引入新的介词变量, 这两件事都不合适:

Example: Compression (Bad)
Input:
  (p & q & s & t) v
  (p & r & s & t) v
  (p & q & s & u) v
  (p & r & s & u) v 
  w.

Output:
  (p & ((q & s & (t v u)) v (r & s & (t v u)))) v
  w.

- or -

Output:
  (p & ((q & h) v (r & h))) & (h <-> s & (t v u))) v
  w.

结果应该是单个公式,不再是DNF , 这比二元决策图更紧凑 仅使用析取和连接的算法, 和已经找到的介词变量 原DNF。以下是所需压缩的示例:

Example: Compression (Good)
Input:
  (p & q & s & t) v
  (p & r & s & t) v
  (p & q & s & u) v
  (p & r & s & u) v
  w.

Output:
  (p & (q v r) & s & (t v u)) v
  w.

你会怎么做? Prolog实现首选。

再见

1 个答案:

答案 0 :(得分:2)

我认为你需要的是一个系统的算法来计算两层中布尔表达式的最小值(输入变量的连词的分离,或输入变量的析取的连接)。

用于执行此操作的常用算法是Karnaugh mapsQuine-McCluskey算法。

这些算法适用于否定变量。在任何情况下,至少如果您的输入处于析取范式(DNF)并且没有出现否定变量,则表示为输入变量的连接的分离的输出也不会有否定变量。)