4

我想簡化形式的一個非常大的布爾函數:算法簡化布爾表達式

f(a1,a2,....,an)= (a1+a2+a5).(a2+a7+a11+a23+a34)......(a1+a3+an). 

「」裝置或

「+」裝置和

可能有100個這樣的術語(「」彼此)的n 值可高達去30.

是否有任何可行算法來簡化此?

注意:這不是一個實驗室任務,這是我粗略的規則生成規則生成的一小部分,其中f是不相似函數。

+0

由於不是所有的語言都使用這種表示法,你能具體說明'.'和'+'運算符是什麼嗎?我假設OR和AND? –

+1

「簡化」是什麼意思? –

+1

如果是這種情況,那麼「簡化」的主要方法是,如果有條款可以在所有或組中拔出。除此之外,您可能可以重組,但我不認爲會有大規模的簡化。 –

回答

0

典型的方法是使用boolean algebra將語句簡化爲最簡單的形式。

如果,例如,您有類似:

(A AND B) OR (A AND C)

,你可以將其轉換爲更簡單的形式:

A AND (B OR C)

0

如果你所代表的一個值作爲intlong其中a1具有值2,a2具有值4,a3具有值8等:

int a =(a1? 2^1:0)+(a2 2^2:0)+(a3 2^3:0)+ ...;

(浪費了位保持它的簡單和無視事實,你會與A0更好= 1)

與您所有的條款做同樣的:

long[] terms = ...; 
terms[0] = 2^0 + 2^3 + 2^5   // a1+a2+a5 
terms[1] = 2^2 + 2^7 + 2^23 + 2^34 // (a2+a7+a11+a23+a34) 

然後你就可以找到結果:

foreach(var term in terms) 
{ 
    if (a & term == term) return true; 
} 
return false; 

但這只是非常適用於多達N = 64。在這之上它是混亂。

+0

是啊!我嘗試了類似的方法,但最後我得到了一個規則,例如a1 + a2 + .. + ak-> dicision,但是我必須得到a1.a2 .... ak-> dicision的形式,所有的術語和彼此,如何從這裏得到它? – sb15

+0

@ sb15不知道你的意思。 for循環創建OR,只要其中一個項匹配其所有位,就立即返回true。實際上:result = a&term [0] == term [0] | a&term [1] == term [1] | ... a&term [m] == term [m] –

4

衆所周知的方法來做到這一點是:

第二種方法是計算機上最常用的方法。它是表格式和直接的。第一種方式是手工操作的最佳方式,並且更有趣,但不能將其用於可靠的超過4個變量。