Loading

Q-M(Quine-McCluskey)两级逻辑化简算法原理解析

转载请务必注明出处:https://www.cnblogs.com/the-wind/p/15764283.html,感谢合作。
本文多次修订,务必以该地址内容为准。

1 背景介绍:两级逻辑

  香农在他的硕士论文[1]中提出了开关电路的综合方法,其中提到香农展开定理,即任意n变量布尔函数\(f(x_1,...,x_{n-1},x_n)\)都可展开为SOP:

\[\begin{align*} f(x_1,...,x_{n-1},x_n) = f(0,...,0,0)x_1'...x_{n-1}'x_n' + \\ f(0,...,0,1)x_1'...x_{n-1}'x_n + \\ ... + \\ f(1,...,1,1)x_1...x_{n-1}x_n \end{align*} \]

  亦可根据布尔代数的对偶性得到等价的POS形式。SOP或POS对应布尔网络深度为2,现在一般称为两级逻辑。

  这种方法很容易综合组合逻辑,其缺点是对于特定布尔函数存在指数爆炸问题(结点数可达\(O(n^2)\)),此外各结点的扇入扇出一般较高。为了降低开销,需要进行逻辑化简。

  两级逻辑化简是输出限制于SOP/POS形式的逻辑化简。之所以希望输出仍然是两级逻辑,是因为两级逻辑具有特定优势,例如物理结构规则,传播延迟低等,过去常见于可编程逻辑器件中。

2 Quine-McCluskey两级逻辑化简

  一些概念:

变元:x1,x2,...xn
文字:变元或其否定:x1, x1',...
子句(乘积项、项):不重复文字的合取:x1x2, x1'x2,...

  逻辑化简本质上是对表达式进行等价转化以最小化代价函数的优化过程,其中代价函数评估了表达式的优劣(如对应电路的PPA)。定义SOP表达式E的代价函数为:

\[\mathcal{L}(E) = E子句个数 + E文字的个数 \]

  给定布尔函数f,\(\arg\min\limits_{E=f} \mathcal{L}(E)\)即为两级逻辑化简的结果,其中E必须是SOP表达式。

  \(\arg\min\limits_{E=f} \mathcal{L}(E)\)具有最小的电路面积,这是因为E的子句的个数决定第二级逻辑(OR)的面积,文字的个数决定第一级逻辑(AND)的面积。

  我们熟知的卡诺圈数量越少,则对应子句越少;卡诺圈面积越大,则消去的文字约多。但卡诺图对于高维函数显得无能为力,在工程应用中失去价值。其实卡诺图中最大的圈本质上对应素蕴涵项。素蕴涵项是两级逻辑化简的核心概念。要理解这个概念,需要一些前置知识,之后我们将结合Quine[2]证明:

定理1:代价函数\(\mathcal{L}(E)\)定义的最小SOP表达式一定是素蕴涵项之和

  这定理对搜索空间做出了限定:只需在E的素蕴涵项的组合中搜索最小代价即可。这就是Q-M的核心思想。至于如何搜索,Quine在[2]中提出了一种做法。但本文后面可以看到,该问题可以转化为很多其它常见的问题形式,如SCP、Max-SAT等等,利用现代优化过的SOTA求解器解决。

2.1 蕴涵项与素蕴涵项

  蕴涵项、素蕴涵项、最小化素蕴涵项等术语的定义在不同文章中有区别,会造成讨论上的误解,因此必须在此明确。

  首先需要明确ON/OFF集与无关DC集(Don't care set)的概念。逻辑函数\(f: \{0,1\}^n \rightarrow \{0,1,*\}\),其中\(*\)表示无关位(0或1都可以),f的反函数记为\(f^{-1}\)。ON定义为\(f^{-1}(1)\),即f=1的所有最小项。OFF定义为\(f^{-1}(0)\)。DC定义为\(f^{-1}(*)\)。一个逻辑函数f可以表示为\(f=ON \cup DC\)

  例如,给定逻辑函数g(x,y,z)=xy+z,无关项xyz,其ON集为{xyz',x'y'z,x'yz,xy'z},DC集为{xyz},OFF集为{x'y'z',x'yz',xy'z'}。

  定义\(\preceq\)为布尔代数\(B(;+,*,\bar{\space},0,1)\)上的偏序关系,\(x \preceq y\iff x\rightarrow y\iff\)使x为真的变元取值代入y结果为真。给定函数f和子句p,如果\(p \preceq ON \cup DC\),则p是f的一个蕴涵项。显然f的蕴涵项p必不满足\(p \preceq OFF\)。f的所有蕴涵项之和与f逻辑等价。

  例如,f的所有最小项都是它的蕴涵项。又如,上面例子中\(\{x'z\}\preceq ON\)是f的一个蕴涵项,因为若x'z=1,则变元x=0,z=1,则ON的子集{x'y'z, x'yz}=1。还要强调蕴涵项一定是子句,这与布尔代数中讨论的蕴涵有明显区别,例如2元布尔代数中\(xy+x'y'\preceq x'+y\),但\(xy+x'y'\)不是子句。

  如果p是f的蕴涵项,且f不存在其它的蕴涵项\(p'\)满足:\(p \preceq p'\),且p'具有比p更少的文字,那么p同时也是f的最小化素蕴涵项,本文简称素蕴涵项。也就是说,任何一个素蕴涵去掉任意文字都导致非蕴涵。

  现在能理解为什么在卡诺图中,如果一个圈不可能被其他更大的圈包含,则该圈就对应素蕴涵项。因为假设圈c被更大圈c'的包含,则c'对应表达式\(\preceq\)c,且c'具有比c更少的文字(c’能消去更多文字),与素蕴涵矛盾。直观上讲,如果f的一个蕴涵项p不是素蕴涵,则有可能通过删除p中的一个文字,将p变为素蕴涵,并项法可以实现这种删除,这也是之后要介绍的。

2.2 Quine-McCluskey算法原理

  下面证明定理1:
设SOP表达式为\(\Phi\)\(\Phi\)的每个子句为\(e\),且\(\mathcal{L}(\sum_{e \subseteq \Phi} e)\)取最小值。
显然\(e\preceq \Phi\)
如果\(\Phi\)的子句中存在e不是素蕴涵,则存在\(b\preceq \Phi\),满足\(e \preceq b\),b文字数小于等于e。
所以存在\(\varphi=(\Phi-{e})\cup b\)\(\mathcal{L}(\sum_{b \subseteq \varphi} b) < \mathcal{L}(\sum_{e \subseteq \Phi} e)\),与假设矛盾
所以e必须是E的素蕴涵。
Q.E.D

  例如,f=xy'+y,已知x是xy'关于f的素蕴涵,则可以通过将xy'替换为x,得到f=x+y,减少一个文字,得到更优结果。

  如何计算所有符合定义的素蕴含项就成为接下来的问题。我们在下一节证明一些引理后就可以设计出枚举素蕴涵的算法。现在已经有了算法的全貌。定理1给出了最优解的必要条件,因此只需在所有素蕴涵项\(P\)中找解,即解决如下组合优化问题

\[\arg\min_{M} (\mathcal{L}(\sum_{p \in M} p)) \]

    s.t. (1). \(M\subseteq P\)
      (2) \(ON \subseteq M \subseteq (ON \cup DC)\),即\(M\)与原始函数逻辑等价

  稍后的分析将看到,可以把这个问题等价转换为集合覆盖问题(SCP)、Max-SAT等等问题形式来求解。

3 Quine枚举素蕴涵项

  Quine在原始论文[2]中的THEOREM 2~4说明了列举素蕴涵项的原理,通过定义subsume和completion的概念完成了证明。为了不引入新的概念,本文提供一种新的角度,从熟知的并项法的角度给出证明。

  显然布尔函数f的所有最小项都是f的蕴涵项。对相邻最小项使用并项法:

性质1:并项法:\(y \preceq xy + x'y\)

  这表明相邻两项(仅相差一对互补的变元)应用并项法可以导出一个新的蕴涵项,并且少一个文字。然而蕴涵项不一定都是素蕴涵项,如下两个引理用于计算素蕴涵项:

引理1:如果对于函数f的蕴涵项a,存在f的蕴涵项b,使a、b可根据并项法产生新的蕴涵项c,则a、b都不是素蕴涵项。

  证明:
由布尔格性质:
\(a \preceq a + b\)\(b \preceq a + b\)
已知蕴涵项c是由a、b并项产生的,即\(c = a + b\)
所以\(a \preceq c\)\(b \preceq c\)
已知a、b是f的蕴涵项,\(a \preceq f\)\(b \preceq f\)
所以\(a + b \preceq f\),即\(c \preceq f\)
即函数f存在另一个蕴涵项c,且满足\(a \preceq c\)\(b \preceq c\) ......(1)
又因为并项法结果必然少1个文字,所以c的文字少于a、b ......(2)
(1)、(2)与素蕴涵项的定义矛盾,所以a、b不是素蕴涵项
Q.E.D.

引理2:若函数f的蕴涵项\(a\)不是函数f的素蕴涵项,则存在f的蕴涵项\(b\),a、b可以根据并项法产生新的蕴涵项c

  证明:
已知\(a \preceq f\),且a不是素蕴涵项
则由素蕴涵定义可知 \(\exist a'\preceq f且a'\ne a\), 使\(a=a'\zeta\)
其中\(\zeta\)是属于a而不属于a'的非空文字串
因为\(a'\bar{\zeta}\preceq a' \preceq f\)
\(a'\bar{\zeta}\)是f的一个蕴涵项
所以存在\(b=a'\bar{\zeta}\),使得\(a+b=a'\zeta+a'\bar{\zeta}=a'\)
Q.E.D.

  根据引理1、2,推出:

定理2 函数f的蕴涵项a不是素蕴涵项的充分必要条件是,存在f的蕴涵项b,使a、b可以根据并项法产生新的蕴涵项。

  据此可设计一种基于筛选的算法,对于f的每一个蕴涵项,验证是否存在另一个蕴涵项可以与它并项,若能则排除该非素蕴涵项,最终排除所有非素蕴涵项:

  • P0 输入f,展开f的所有最小项加入T中
  • P1 如果存在\(a,b \in T\)可以并项为c,则标记a、b,把c加入T
  • P2 重复P1直到无蕴涵项可加入
  • P3 输出未被标记的项(素蕴涵项)。

  注意到算法中如果a、b可以并项,不删除a、b,而要继续跟其它项合并。设想如果删除了a、b,就会丢失只有与a、b并项才能得到的蕴含项,从而漏解。

  上述算法中还有一个重要问题,为什么从函数f的所有最小项出发,可以求出f的所有素蕴涵项?(暂时不考虑无关项)

定理3 f的蕴涵项的所有文字一定包含在f的某个最小项中

  证明:
假设f的蕴涵项p的所有文字不包含在f的所有最小项\(m_i\)
由最小项定义,\(m_i\)包含f的所有变元。
\(m_i\)和p必然包含互补的文字,即\(m_i=m'_i\xi\)\(p=p'\bar\xi\)
则p=1时,\(\xi=0\)\(m_i=0\)
\(p \preceq m_i\)不成立,与p是蕴涵项矛盾。
Q.E.D

  这说明蕴涵项只能从最小项删除部分文字产生。由性质1,删除k>1个文字等价于对两个从最小项删除k-1个文字得到的相邻蕴涵项运用并项法,即对2^k个相邻最小项运用并项法。因此算法P1步能不断生成新的蕴涵项,同时利用定理2排除非素蕴涵。当算法步P2跳出循环后,T中一定包含所有蕴涵项/素蕴涵项。

  上述算法的P2中,蛮力实现需要两两比较蕴涵项,其实对子句排序(分组)后再相邻比较就可以,这就导出了优化后的算法:

算法1:求所有素蕴涵项
输入:ON:f=1的所有最小项
输出:PI:素蕴涵项集合
1. 将ON中的子句按反变元(变元的补)的个数分组,没有出现反变元的项归为第n组、有1个反变元的项为n-1组、……、有n个反变元的项为第0组。对于反变元个数相同的子句,再按变元的字典序排序。
2. 依次比较相邻两组(第\(i\)\(i+1\)组的每一对子句(从第\(i\)组选择一个子句,再从第\(i+1\)组选择一个子句构成一对)。如果这对子句仅一个文字不同(形如xy与x'y),则标记这两项,根据并项法生成一个蕴涵项y。
3. 迭代处理:如果步骤2生成了一些蕴涵项,令ON为新生成的蕴涵项构成的集合,转到1;如果不再生成任何蕴涵项,结束。
经过上述步骤,所有未被标记的子句就是素蕴涵项。

  下面举一些实例。

例1:Quine算法计算f=x'y'z'+x'zw'+xy'zw'+xy'z'的素蕴涵项
香农展开得到最小项表达式f=x'y'z'w' + x'y'z'w + x'y'zw' + x'yzw' + xy'z'w' + xy'z'w + xy'zw'
分组、迭代计算过程如下:

最小项 + 标记 1次迭代 + 标记 2次迭代 + 标记
第0组 x'y'z'w' √
第1组 x'y'z'w √
x'y'zw' √
xy'z'w' √
x'y'z' √
x'y'w' √
y'z'w' √
第2组 x'yzw' √
xy'z'w √
xy'zw' √
y'z'w √
x'zw'
y'zw'
xy'z' √
xy'w' √
y'z'
y'w'

未标记√的项:x'zw'、y'zw'、y'z'、y'w'即为所有素蕴涵项。

  上述算法未考虑含无关项的情况。其实可以将无关项布尔展开,统一当成最小项处理。只不过所有从无关项产生的素蕴涵项都可以丢弃。

  下面扩展上述算法使其能够处理无关项:单独标记无关项,当用并项法合并a、b两项时,如果a、b都标记为无关项,那么结果c也标记为无关项。最后所有标记了d的素蕴涵项都可以丢弃。

例2:Quine算法计算f=yz'+xy'z(无关项d=x'z)的素蕴涵项

最小项 + 标记 1次迭代 + 标记
第0组 x'yz' √
x'y'z √ d
第1组 x'yz √ d
xyz' √
xy'z √
x'y
yz'
x'z d
y'z

未标记√和d的项:x'y、yz'、y'z即为所有素蕴涵项。

4 生成最小SOP的几种方法

  Quine方法计算出了函数f的所有素蕴涵项\(P\subseteq (ON \cup DC)\)。回顾3.2,为了生成最小SOP,我们要选出P的一个子集M,该子集要满足\(ON \subseteq M \subseteq (ON \cup DC)\),同时代价函数\(\mathcal{L}(\sum_{p \in M} p)\)要最小化,这是一个组合优化问题。

  下面以例1说明该问题。

\[\begin{array}{lc} \mbox{}& \begin{array}{cc}x'zw' & y'zw' & y'z' & y'w' \end{array}\\ \begin{array}{c}x'y'z'w' \\ x'y'z'w \\ x'y'zw' \\ x'yzw' \\ xy'z'w' \\ xy'z'w \\ xy'zw'\end{array}& \left[\begin{array}{cc} 0&&0&&1&&1\\ 0&&0&&1&&0\\ 1&&1&&0&&1\\ 1&&0&&0&&0\\ 0&&0&&1&&1\\ 0&&0&&1&&0\\ 0&&1&&0&&1\\ \end{array}\right] \end{array} \]

  上面覆盖矩阵的行对应最小项,列对应素蕴涵项。矩阵元素\(a_{ij}=1\)表示第j个素蕴涵项\(\preceq\)第i个最小项。然而直接判断\(\preceq\)关系比较困难,下面要证明一个定理以简化判断。

定理4:如果子句p的所有文字都包含在子句m中,则\(m \preceq p\)

  证明:
假设m=1,则m中每个文字=1
已知p的所有文字都包含在m中,所以p的每个文字=1
所以p=1
所以\(m \preceq p\)
Q.E.D

  因此可以通过字符串包含关系判断第j个素蕴涵项的所有文字是否都包含在第i个最小项中,若包含则\(a_{ij}=1\)

  为了满足\(ON \subseteq M\),我们需要恰当选取一些列,使得这些列构成的矩阵每一行都至少有一个1。例如选择列x'zw'、y'z'和y'w'构成如下矩阵:

\[\begin{array}{lc} \mbox{}& \begin{array}{cc}x'zw' & y'z' & y'w' \end{array}\\ \begin{array}{c}x'y'z'w' \\ x'y'z'w \\ x'y'zw' \\ x'yzw' \\ xy'z'w' \\ xy'z'w \\ xy'zw'\end{array}& \left[\begin{array}{cc} 0&&1&&1\\ 0&&1&&0\\ 1&&0&&1\\ 1&&0&&0\\ 0&&1&&1\\ 0&&1&&0\\ 0&&0&&1\\ \end{array}\right] \end{array} \]

  这个例子中矩阵每行都至少有一个1,这意味着所有最小项都至少被一个选定的素蕴涵项盖住,即\(ON \subseteq \{x'zw', y'z', y'w'\}\),所以选择M={x'zw', y'z', y'w'}是可行的。

  为了最小化代价函数\(\mathcal{L}(\sum_{p \in M} p)\),选择的列应尽可能少;当存在多种列数相同的方案时,应优先选择文字数少的方案。例1只有唯一可行解,代价函数\(\mathcal{L}(x'zw' + y'z' + y'w') = 10\),最小SOP表达式为x'zw' + y'z' + y'w'。

4.1 集合覆盖

  仔细将上述问题与集合覆盖问题(SCP)对比,就会发现两者是等价的。SCP问题是NP-hard的,因此上述问题也是NP-hard的。
  求解SCP的方法主要有分支限界法(保证最优性)和启发式算法,涉及剪枝等大量Ad-hoc技术,本文无法一一列举。

4.2 Max-SAT

  这里再说一种求解思路:将生成最小SOP问题转换为Max-SAT。

  很多组合优化问题都可以编码成Max-SAT问题。SAT问题是说判断CNF表达式的可满足性。若存在真值指派使表达式为1(即CNF的所有从句都满足),则CNF是可满足的;如果这组值不存在,则判定为不可满足(可证伪的)。
  Weighted Partial Max-SAT(WPMS)是SAT的变种,将CNF表达式中的子句分成软/硬子句,要求所有硬子句都满足,同时最小化不满足的软子句的权重之和,属于优化问题。

4.2.1 生成最小SOP的问题编码

  1. 变元:\(\forall p \in P\),定义变元\(v_p=0\)表示素蕴含项p不包含在答案M中,\(v_p=1\)表示素蕴含项p包含在M中。
  2. 硬子句:\(\forall m \in ON\),添加硬子句\(\{v_p|m \preceq p,p \subseteq P\}\),保证所有最小项都至少被一个选定的素蕴涵项盖住。
  3. 软子句:\(\forall p \in P\),添加软子句\(\neg p\),设置权重\(w(p)=p中文字的个数\)

求解上述问题,得变元赋值v0,v1,v2,...,vi,对应第i个素蕴含项是否被选中。

4.2.2 求解器

  最近的2022 MaxSAT Evaluation结果可在https://maxsat-evaluations.github.io/2022/rankings.html查看,代表了SAT求解器的SOTA。
  MaxSAT的求解并不是本文重点,直接调用Loandra求解器。

4.2.3 求解实例

  第3节中的例1,首先运行Quine算法,得到素蕴含项\(x'zw', y'zw', y'z', y'w'\)
  接下来调用Loandra求解SCP,设编号1 2 3 4的CNF变量的含义是对应素蕴含项是否被选取,按4.1.1节所述编写CNF文件如下:

c WPMS
h 3 4 0
h 3 0
h 1 2 4 0
h 1 0
h 3 4 0
h 2 4 0
3 -1 0
3 -2 0
2 -3 0
2 -4 0

  (h表示硬子句,0表示输入结束,数字开头的行表示软子句的权重,-号表示否定\(\neg\))

执行./loandra input.txt,得到求解结果:

c ========================================[ Problem Statistics ]===========================================
c |  
c |  Problem Format:             MaxSAT     
c |  Problem Type:             Weighted  
c |  Number of variables:             4 
c |  Number of hard clauses:          6  
c |  Number of soft clauses:          4   
c |  Number of cardinality:           0  
c |  Number of PB :                   0  
c |  Parse time:                   0.00 s   
c | 
o 7
s OPTIMUM FOUND
v 1011

  Loandra给出的解为1011,对应满足CNF的各变量的一组取值。按照上文变量假设,可知化简结果为\(x'zw' + y'z' + y'w'\)

5 时间复杂度

  Quine的主要时间消耗在最小项生成。利用香农展开n变量布尔函数,最坏时间为\(O(2^n)\)。而生成最小SOP最坏时间为\(O(2^n)\)。总时间随变量个数n增加呈指数级增长。

参考

[1] C. E. Shannon, "A symbolic analysis of relay and switching circuits," in Electrical Engineering, vol. 57, no. 12, pp. 713-723, Dec. 1938, doi: 10.1109/EE.1938.6431064.
[2] Quine, W. V.. “The Problem of Simplifying Truth Functions.” American Mathematical Monthly 59 (1952): 521-531.

posted @ 2023-03-09 19:46  TheWind  阅读(987)  评论(0编辑  收藏  举报