簡體   English   中英

簡化布爾表達式算法

[英]Simplify boolean expression algorithm

有人知道一個簡化布爾表達式的算法嗎?

我記得布爾代數和Karnaught地圖,但這適用於EVERITHING為布爾值的數字硬件。 我想要考慮一些子表達式不是布爾值的東西。

例如:

a == 1 && a == 3

這可以轉換為純布爾表達式:

a1 && a3 

但這是表達是不可簡化的,而對於算術的一點點知識,everibody可以確定表達式只是:

false

有些人知道一些鏈接?

您可能對K-mapsQuine-McCluskey算法感興趣。

我認為SymPy能夠解決和簡化布爾表達式,查看源代碼可能很有用。

這個問題有兩個部分,邏輯簡化和表示簡化。

為了簡化邏輯,Quine-McCluskey。 為了簡化表示,使用分布標識(0&1 | 0&2)== 0&(1 | 2)遞歸地提取術語。

我在這里詳述了這個過程。 這給出了僅使用&和|的解釋,但可以修改它以包括所有布爾運算符。

您的特定示例將由SMT解算器解決 (它確定變量的設置不能使表達式成為真;因此它總是錯誤的。更一般的簡化超出了此類求解器的范圍。)顯示表達式等效於truefalse當然是NP-即使沒有將算術帶入交易中也很難,所以即使這樣也有很多實用的軟件。 根據范圍內的算術知識量,問題可能是不可判定的

使用谷歌的第一槍發現了這篇論文:

http://hopper.unco.edu/KARNAUGH/Algorithm.html

當然,這不涉及非布爾子表達式。 但是后一部分的一般形式確實很難,因為肯定沒有算法來檢查任意算術表達式是真,假或其他。 您要求的內容深入到編譯器優化領域。

可能的不同值的數量是否有限且已知? 如果是這樣,您可以將每個表達式轉換為布爾表達式。 例如,如果a有3個不同的值,那么你可以有變量a1a2a3 ,其中a1為真意味着a == 1 ,等等。一旦你這樣做,你可以依賴Quine-McCluskey算法(這可能更好比卡諾圖更大的例子)。 以下是Quine-McCluskey的一些Java代碼

我不能說這個設計是否會真正簡化事情或使它們更復雜,但你可能至少要考慮它。

這很難。 我找到的算法以最簡單的方式匹配每個輸出組合,每個輸入組合。 但這是基本的算法,沒有解決每一個表達。

如果所有輸出(q1,q2,q3,q4)與輸入A組合相同,那么簡化的結果將是A.

如果沒有,您將嘗試另一個變量/輸入依賴項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM