[英]Simplify boolean expression algorithm
有人知道一個簡化布爾表達式的算法嗎?
我記得布爾代數和Karnaught地圖,但這適用於EVERITHING為布爾值的數字硬件。 我想要考慮一些子表達式不是布爾值的東西。
例如:
a == 1 && a == 3
這可以轉換為純布爾表達式:
a1 && a3
但這是表達是不可簡化的,而對於算術的一點點知識,everibody可以確定表達式只是:
false
有些人知道一些鏈接?
您可能對K-maps和Quine-McCluskey算法感興趣。
我認為SymPy能夠解決和簡化布爾表達式,查看源代碼可能很有用。
這個問題有兩個部分,邏輯簡化和表示簡化。
為了簡化邏輯,Quine-McCluskey。 為了簡化表示,使用分布標識(0&1 | 0&2)== 0&(1 | 2)遞歸地提取術語。
我在這里詳述了這個過程。 這給出了僅使用&和|的解釋,但可以修改它以包括所有布爾運算符。
使用谷歌的第一槍發現了這篇論文:
http://hopper.unco.edu/KARNAUGH/Algorithm.html
當然,這不涉及非布爾子表達式。 但是后一部分的一般形式確實很難,因為肯定沒有算法來檢查任意算術表達式是真,假或其他。 您要求的內容深入到編譯器優化領域。
可能的不同值的數量是否有限且已知? 如果是這樣,您可以將每個表達式轉換為布爾表達式。 例如,如果a有3個不同的值,那么你可以有變量a1
, a2
和a3
,其中a1
為真意味着a == 1
,等等。一旦你這樣做,你可以依賴Quine-McCluskey算法(這可能更好比卡諾圖更大的例子)。 以下是Quine-McCluskey的一些Java代碼 。
我不能說這個設計是否會真正簡化事情或使它們更復雜,但你可能至少要考慮它。
這很難。 我找到的算法以最簡單的方式匹配每個輸出組合,每個輸入組合。 但這是基本的算法,沒有解決每一個表達。
如果所有輸出(q1,q2,q3,q4)與輸入A組合相同,那么簡化的結果將是A.
如果沒有,您將嘗試另一個變量/輸入依賴項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.