轉載請務必註明出處:https://www.cnblogs.com/the-wind/p/15764283.html
1 背景介紹:兩級邏輯
夏農在他的碩士論文[1]中提出了開關電路的綜合方法,其中提到夏農展開定理,即任意n變數布林函式\(f(x_1,...,x_{n-1},x_n)\)都可展開為SOP:
亦可根據布林代數的對偶性得到等價的POS形式。SOP或POS對應布林網路深度為2,現在一般稱為兩級邏輯。
這種方法很容易綜合組合邏輯,其缺點是對於特定布林函式存在指數爆炸問題(結點數可達\(O(n^2)\)),此外各結點的扇入扇出一般較高。為了降低開銷,需要進行邏輯化簡。
兩級邏輯化簡是輸出限制於SOP/POS形式的邏輯化簡。之所以希望輸出仍然是兩級邏輯,是因為兩級邏輯具有特定優勢,例如物理結構規則,傳播延遲低等,過去常見於可程式設計邏輯器件(PLD)中。
2 Quine-McCluskey兩級邏輯化簡
一些概念:
變元:x1,x2,...xn
文字:變元或其否定:x1, x1',...
子句(乘積項):文字的合取:x1x2, x1'x2,...
邏輯化簡本質上是對錶達式進行等價轉化以最小化代價函式的最佳化過程,其中代價函式評估了表示式的優劣(如對應電路的PPA)。定義SOP表示式E的代價函式為:
給定布林函式f,\(\arg\min\limits_{E=f} \mathcal{L}(E)\)即為兩級邏輯化簡的結果,其中E必須是SOP表示式。
\(\arg\min\limits_{E=f} \mathcal{L}(E)\)具有最小的電路面積,這是因為E的子句的個數決定第二級邏輯(OR)的面積,文字的個數決定第一級邏輯(AND)的面積。
根據卡諾圖,容易想到如下演算法:對f的所有最小項,利用並項法則(xy + x'y = y)合併相鄰兩項(恰有一對互補的變元,其餘文字相同),其結果是代價函式減少了2(子句個數和文字個數都減少1)。對合並得到的所有子句迭代地應用並項法,直到無法合併為止,所得子句的析取顯然與f是邏輯等價的,且代價函式小於等於初值。
不幸的是,這方法有時不能得到最優解,舉反例證明:f=xy'+x'y+yz'+y'z,無法對其應用並項法,演算法結束,但事實上f=xy'+x'y+yz'和f=xy'+x'y+y'z都比原式更簡。這種啟發式失敗了。幸運的是Quine透過引入素蘊涵項成功解決了問題,而素蘊涵的求解與上述過程類似。
要理解素蘊涵的概念,需要一些前置知識,準備好後我們將結合Quine[2]的定理,證明:
定理1:代價函式\(\mathcal{L}(E)\)定義的最小SOP表示式一定是素蘊涵項之析取
這定理提供了Q-M演算法的核心思路:在E的素蘊涵項的組合中尋找答案。
2.1 蘊涵項與素蘊涵項
首先需要明確ON/OFF集與無關DC集(Don't care set)的概念。邏輯函式\(f: \{0,1\}^n \rightarrow \{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'}。
給定函式f和從句p,如果\(p \subseteq ON \cup DC\),則p是f的一個蘊涵項。如在上面例子中\(\{x'z\}\subseteq ON\)。注意上述包含關係實質上為布林代數上的偏序關係,\(p \subseteq f \iff p \preceq f\)。下文將大量應用布林代數的一些性質和定理而不加說明。
顯然有\(ON \subseteq \sum_{p\in f}p\),即f的所有蘊涵項蓋住了f=1的全部最小項,且根據定義\(OFF \not\subset \sum_{p\in f} p\),即不蓋住f=0的最小項f。
如果p是f的蘊涵項,且f不存在其它的蘊涵項\(p'\)滿足\(p \subseteq p'\),p'具有更少的文字,那麼p同時也是f的素蘊涵項。
2.2 Quine-McCluskey演算法原理
下面證明定理1:
設與\(E\)等價的SOP表示式為\(\Phi\),\(\Phi\)的每個子句為\(e\),且\(\mathcal{L}(\sum_{e \subseteq \Phi} e)\)取最小值。
顯然\(e\subseteq \Phi\),\(e\subseteq E\)。
如果\(\Phi\)的子句中存在e不是素蘊涵,則存在\(b\subseteq \Phi\),滿足\(e \subseteq 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
可見演算法的最優性是由素蘊涵的定義保證的,如何計算所有符合定義的素蘊含項就成為核心問題。我們在下一節證明一些引理後就可以設計出列舉素蘊涵的演算法。
暫時回到整個化簡演算法,定理1給出了最優解的必要條件,因此只需在所有素蘊涵項\(P\)中找解。顯然最優解\(M \subseteq P\)滿足如下條件:
(1)\(M\)與原始函式邏輯等價,即\(ON \subseteq M \subseteq (ON \cup DC)\)
(2)\(\mathcal{L}(\sum_{p \in M} p)\)取最小值。
子集\(M\)的選擇是一個組合最佳化問題。稍後的分析將看到,其本質為集合覆蓋問題(SCP)。
3 Quine列舉素蘊涵項
Quine利用如下性質和定理計算蘊涵項:
並項法:xy + x'y = y
定理3:y是xy + x'y的蘊涵項
證明:
\(y是xy + x'y的蘊涵項\)
\(\iff y \preceq xy + x'y\)
\(\iff y(xy + x'y)' = \bf{0}\)
\(\iff yy' = \bf{0}\)
Q.E.D
定理3表明,對相鄰兩項(僅相差一對互補的變元)之和應用並項法可以匯出一個蘊涵項。
然而定理3中的蘊涵項不一定是素蘊涵項,如下定理用於計算素蘊涵項:
定理4:如果函式f的一對蘊涵項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個文字,所以c的文字少於a、b。
上述兩條結論與素蘊涵項的定義矛盾,所以a、b不是素蘊涵項
Q.E.D.
根據定理4,可設計一種基於篩選的演算法,從一組蘊涵項T中求素蘊涵:
- P1 [並項] 如果存在\(a,b \in T\)滿足定理4的條件,標記a、b,把c加入T
- P2 重複P1直到無蘊涵項可加入
- P3 未被標記的蘊涵項一定是素蘊涵項。
演算法中如果a、b可以並項,不能刪除a、b,而要繼續跟其它項合併。設想如果刪除了a、b,就會丟失只有與a、b並項才能得到的蘊含項。這與本文一開始提到的迭代演算法有所不同。
注意到布林函式f的所有最小項都是蘊涵項,以這些蘊涵項為初始的T,運用上述演算法可計算出f的所有素蘊涵項。
因為所有最小項構成原子,合併原子所得素蘊涵項沒有遺漏,結果是完備的。
上述演算法的P2蠻力實現需要\(O(n^2)\)時間。經過簡單最佳化後,得到Quine求素蘊涵的演算法:
演算法1:計算所有素蘊涵項 |
---|
輸入:ON:f=1的所有最小項 |
輸出:PI:素蘊涵項集合 |
1. 將ON中的乘積項按反變數(變數的補)的個數分組。沒有出現反變數的項歸為第n組、有1個反變數的項為n-1組、……、有n個反變數的項為第0組。 |
2. 依次比較相鄰兩組(第\(i\)和\(i+1\),\(i-1\)組(如果存在的話)的每一對乘積項(從第\(i\)組選擇一個乘積項,再從第\(i+1\)或\(i-1\)組選擇一個乘積項構成一對)。如果這對乘積項僅一個文字不同(形如xy與x'y),則標記這兩項,根據並項法生成一個蘊涵項y。 |
3. 迭代處理:如果步驟2生成了一些蘊涵項,令ON為新生成的蘊涵項構成的集合,轉到1;如果不再生成任何蘊涵項,結束。 |
經過上述步驟,所有未被標記的乘積項就是PI。 |
演算法中只需相鄰兩個分組比較,因為不相鄰的分組必不可合併。
下面舉一些例項。
例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說明該問題。
上面覆蓋矩陣的行對應最小項,列對應素蘊涵項,矩陣元素\(a_{ij}=1\)表示第j個素蘊涵項蓋住第i個最小項(事實上只需滿足素蘊涵項j的所有文字都包含在最小項i中。這裡粗略證明:設素蘊涵項為p,最小項為m。假設m=1,則m中每個文字=1,又因為p的所有文字都包含在m中,所以p的每個文字=1,所以p=1,所以\(m \Rightarrow p\),所以\(m \preceq p\))。
為了滿足\(ON \subseteq M\),我們需要恰當選取一些列,使得這些列構成的矩陣每一行都至少有一個1。例如選擇列x'zw'、y'z'和y'w'構成如下矩陣:
這個例子中矩陣每行都至少有一個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'。
問題本質上是集合覆蓋問題(SCP),該問題是NP-hard的。求解SCP的方法主要有分支限界法(保證最優性)和啟發式演算法,涉及大量剪枝和最佳化方法,本文無法一一列舉。
這裡說一種新的求解思路:將SCP編碼為Max-SAT問題。
4.1 Max-SAT問題
SAT問題是說判斷CNF表示式的可滿足性。若存在真值指派使表示式為1(即CNF的所有從句都滿足),則CNF是可滿足的;如果這組值不存在,則判定為不可滿足(可證偽的)。
Weighted Partial Max-SAT(WPMS)是SAT的變種,將CNF表示式中的子句分成軟/硬子句,要求所有硬子句都滿足,同時最小化不滿足的軟子句的權重之和,屬於最佳化問題。
4.1.1 SCP的Max-SAT編碼
- 變元:\(\forall p \in P\),定義變元\(v_p=0\)表示素蘊含項p不包含在答案M中,\(v_p=1\)表示素蘊含項p包含在M中。
- 硬子句:\(\forall m \in ON\),新增硬子句\(\{v_p|m\subseteq p,p \subseteq P\}\),保證所有最小項都至少被一個選定的素蘊涵項蓋住。
- 軟子句:\(\forall p \in P\),新增軟子句\(\neg p\),設定權重\(w(p)=p中文字的個數\)。
求解上述問題,得變元賦值v0,v1,v2,...,vi,對應第i個素蘊含項是否被選中。
4.1.2 求解
最近的2022 MaxSAT Evaluation結果可在https://maxsat-evaluations.github.io/2022/rankings.html檢視,代表了SAT求解器的SOTA。
MaxSAT的求解並不是本文重點,直接呼叫Loandra求解器。
4.2 Loandra求解例項
第3節中的例1,將Quine演算法得到的素蘊含項\(x'zw', y'zw', y'z', y'w'\)分別編號1 2 3 4,按4.1.1節所述編寫CNF檔案如下:
c QM logic simplify
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,對應每個素蘊含項是否可取,因此化簡結果為\(x'zw' + y'z' + y'w'\)。
參考
[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.