を配布します。私は2番目の1を取得するために分配法則を使用:式が大きくなることができA + (B . C) ⇔ (A + B) . (A + C)
は、私が持っているどのようなブール論理式
を常にOR
で区切らAND
のグループで構成されています。 私が探しているのは、論理式を配布できるライブラリです。 Sympyのようなライブラリですが、代数の代わりに論理に適用されます。
を配布します。私は2番目の1を取得するために分配法則を使用:式が大きくなることができA + (B . C) ⇔ (A + B) . (A + C)
は、私が持っているどのようなブール論理式
を常にOR
で区切らAND
のグループで構成されています。 私が探しているのは、論理式を配布できるライブラリです。 Sympyのようなライブラリですが、代数の代わりに論理に適用されます。
Sympyがちょうど取り、これに最適ですlogicモジュール、特にEquivalentと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
あなたがパッケージ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')
)
)
すごい!私はCNFとDNFについて知りませんでした。非常に有益でした。実際に私が望むのはDNFからCNFです。ありがとう、私はモジュールをもっと詳しく見ていきます。 – Dionys