2017-09-20 93 views
3

我有什麼:分發布爾邏輯表達式

(A.B.C) + (D.E) + (F.G.H.I) 

我想用分配律:

(A + D + F).(A + D + G).(A + D + H).(A + D + I). 
(A + E + F).(A + E + G).(A + E + H).(A + E + I). 
(B + D + F).(B + D + G).(B + D + H).(B + D + I). 
(B + E + F).(B + E + G).(B + E + H).(B + E + I). 
(C + D + F).(C + D + G).(C + D + H).(C + D + I). 
(C + E + F).(C + E + G).(C + E + H).(C + E + I) 

兩個表達式是等效的。我用分配法得到第二個:A + (B . C) ⇔ (A + B) . (A + C)

該表達式可以更大,但總是由AND的組合構成,由OR分隔。 我在找的是一個能夠分配邏輯表達式的庫。像Sympy這樣的庫,但是應用於邏輯而不是代數。

回答

2

Sympy是這個完美的選擇,只取一請看logic模塊,特別是Equivalentto_cnf的功能,下面的例子:

from sympy import * 

A, B, C, D, E, F, G, H, I = symbols('A,B,C,D,E,F,G,H,I') 

formula = (
    (A & B & C) | (D & E) | (F & G & H & I) 
) 
formula2 = (
    (A | D | F) & (A | D | G) & (A | D | H) & (A | D | I) & 
    (A | E | F) & (A | E | G) & (A | E | H) & (A | E | I) & 
    (B | D | F) & (B | D | G) & (B | D | H) & (B | D | I) & 
    (B | E | F) & (B | E | G) & (B | E | H) & (B | E | I) & 
    (C | D | F) & (C | D | G) & (C | D | H) & (C | D | I) & 
    (C | E | F) & (C | E | G) & (C | E | H) & (C | E | I) 
) 

print(to_cnf(formula)) 
print(Equivalent(to_cnf(formula), formula2)) 

結果:

(A | D | F) & (A | D | G) & (A | D | H) & (A | D | I) & (A | E | F) & (A | E | G) & (A | E | H) & (A | E | I) & (B | D | F) & (B | D | G) & (B | D | H) & (B | D | I) & (B | E | F) & (B | E | G) & (B | E | H) & (B | E | I) & (C | D | F) & (C | D | G) & (C | D | H) & (C | D | I) & (C | E | F) & (C | E | G) & (C | E | H) & (C | E | I) 
True 
+0

哇錯過了所有的!我甚至不知道CNF和DNF,非常具有啓發性。事實上,我想要的是DNF CNF。謝謝,我們會更詳細地研究模塊。 – Dionys

2

看起來你可以做到這一點的包boolean.py(從皮普與pip install boolean.py安裝):

from boolean import BooleanAlgebra 

exp1 = algebra.parse("(A*B*C) + (D*E) + (F*G*H*I)") 
# Convert to conjunctive normal form (CNF) 
exp2 = algebra.cnf(exp1) 
print(exp2.pretty()) 

輸出:

AND(
    OR(
    Symbol('A'), 
    Symbol('D'), 
    Symbol('F') 
), 
    OR(
    Symbol('A'), 
    Symbol('D'), 
    Symbol('G') 
), 
    OR(
    Symbol('A'), 
    Symbol('D'), 
    Symbol('H') 
), 
    OR(
    Symbol('A'), 
    Symbol('D'), 
    Symbol('I') 
), 
    OR(
    Symbol('A'), 
    Symbol('E'), 
    Symbol('F') 
), 
    OR(
    Symbol('A'), 
    Symbol('E'), 
    Symbol('G') 
), 
    OR(
    Symbol('A'), 
    Symbol('E'), 
    Symbol('H') 
), 
    OR(
    Symbol('A'), 
    Symbol('E'), 
    Symbol('I') 
), 
    OR(
    Symbol('B'), 
    Symbol('D'), 
    Symbol('F') 
), 
    OR(
    Symbol('B'), 
    Symbol('D'), 
    Symbol('G') 
), 
    OR(
    Symbol('B'), 
    Symbol('D'), 
    Symbol('H') 
), 
    OR(
    Symbol('B'), 
    Symbol('D'), 
    Symbol('I') 
), 
    OR(
    Symbol('B'), 
    Symbol('E'), 
    Symbol('F') 
), 
    OR(
    Symbol('B'), 
    Symbol('E'), 
    Symbol('G') 
), 
    OR(
    Symbol('B'), 
    Symbol('E'), 
    Symbol('H') 
), 
    OR(
    Symbol('B'), 
    Symbol('E'), 
    Symbol('I') 
), 
    OR(
    Symbol('C'), 
    Symbol('D'), 
    Symbol('F') 
), 
    OR(
    Symbol('C'), 
    Symbol('D'), 
    Symbol('G') 
), 
    OR(
    Symbol('C'), 
    Symbol('D'), 
    Symbol('H') 
), 
    OR(
    Symbol('C'), 
    Symbol('D'), 
    Symbol('I') 
), 
    OR(
    Symbol('C'), 
    Symbol('E'), 
    Symbol('F') 
), 
    OR(
    Symbol('C'), 
    Symbol('E'), 
    Symbol('G') 
), 
    OR(
    Symbol('C'), 
    Symbol('E'), 
    Symbol('H') 
), 
    OR(
    Symbol('C'), 
    Symbol('E'), 
    Symbol('I') 
) 
) 
+0

我不得不選擇一個答案接受。你的答案也是可以接受的。我只喜歡使用Sympy,因爲@BPL建議。非常感謝您的幫助。 – Dionys

+1

@Dionys是的,我認爲Sympy的答案更有用,因爲它是一個更常見的庫(我只是不知道它也實現了布爾代數)。 – jdehesa