方法涉及兩步:
- 找到這個函數的所有素蘊涵項。
- 使用這些素蘊涵項(implicant)來找到這個函數的本質素蘊涵項,對覆蓋這個函數是必須的其他素蘊涵項也同樣要使用。
例子
最小化一個任意的函數:
A | B | C | D | f(A,B,C,D) | ||
---|---|---|---|---|---|---|
m0 | 0 | 0 | 0 | 0 | 0 | |
m1 | 0 | 0 | 0 | 1 | 0 | |
m2 | 0 | 0 | 1 | 0 | 0 | |
m3 | 0 | 0 | 1 | 1 | 0 | |
m4 | 0 | 1 | 0 | 0 | 1 | |
m5 | 0 | 1 | 0 | 1 | 0 | |
m6 | 0 | 1 | 1 | 0 | 0 | |
m7 | 0 | 1 | 1 | 1 | 0 | |
m8 | 1 | 0 | 0 | 0 | 1 | |
m9 | 1 | 0 | 0 | 1 | x | |
m10 | 1 | 0 | 1 | 0 | 1 | |
m11 | 1 | 0 | 1 | 1 | 1 | |
m12 | 1 | 1 | 0 | 0 | 1 | |
m13 | 1 | 1 | 0 | 1 | 0 | |
m14 | 1 | 1 | 1 | 0 | x | |
m15 | 1 | 1 | 1 | 1 | 1 |
第一步找到素蘊涵項
當然,這的確不是最小化的。為了優化,所有求值為一的極小項都首先放到極小項表中,不必要項也可以加入這個表中與極小項組合:
1的數目 | 極小項 | 二進制表示 |
---|---|---|
1 | m4 | 0100 |
m8 | 1000 | |
2 | m9 | 1001 |
m10 | 1010 | |
m12 | 1100 | |
3 | m11 | 1011 |
m14 | 1110 | |
4 | m15 | 1111 |
1的數目 | 極小項 | 0-立方 | 大小為2的蘊涵項 | 大小為4的蘊涵項 |
---|---|---|---|---|
1 | m4 | 0100 | m(4,12) -100* | m(8,9,10,11) 10--* |
m8 | 1000 | m(8,9) 100- | m(8,10,12,14) 1--0* | |
--------- | --------- | --------- | m(8,10) 10-0 | -------------------------- |
2 | m9 | 1001 | m(8,12) 1-00 | m(10,11,14,15) 1-1-* |
m10 | 1010 | ----------------------- | -------------------------- | |
m12 | 1100 | m(9,11) 10-1 | -------------------------- | |
--------- | --------- | --------- | m(10,11) 101- | -------------------------- |
3 | m11 | 1011 | m(10,14) 1-10 | -------------------------- |
m14 | 1110 | m(12,14) 11-0 | -------------------------- | |
4 | m15 | 1111 | m(11,15) 1-11 | -------------------------- |
m(14,15) 111-
|
第二步找到本質素蘊涵項
沒有項可以繼續進一步這樣組合,所以現在我們構造一個本質素蘊涵項表。縱向是剛才生成的素蘊涵項,橫向是早先指定的極小項。
4 | 8 | 10 | 11 | 12 | 15 | => | A | B | C | D | ||
m(4,12)* | X | X | -100 | => | - | 1 | 0 | 0 | ||||
m(8,9,10,11) | X | X | X | 10-- | => | 1 | 0 | - | - | |||
m(8,10,12,14) | X | X | X | 1--0 | => | 1 | - | - | 0 | |||
m(10,11,14,15)* | X | X | X | 1-1- | => | 1 | - | 1 | - |
OR
最終的等式在功能上等價於最初的等式:
看到素蘊含項一直讓我想到素食 囧 (呂呆)
ReplyDelete