分发布尔逻辑表达式
Distribute boolean logic expression
我有:
(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 的库,但应用于逻辑而不是代数。
看起来你可以使用包 boolean.py 来做到这一点(使用 pip install boolean.py
从 Pip 安装它):
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')
)
)
Sympy 是完美的选择,只需看看 logic module, in particular, Equivalent and to_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
我有:
(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 的库,但应用于逻辑而不是代数。
看起来你可以使用包 boolean.py 来做到这一点(使用 pip install boolean.py
从 Pip 安装它):
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')
)
)
Sympy 是完美的选择,只需看看 logic module, in particular, Equivalent and to_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