2017-09-20 7 views
3

を配布します。私は2番目の1を取得するために分配法則を使用:式が大きくなることができA + (B . C) ⇔ (A + B) . (A + C)は、私が持っているどのようなブール論理式

を常にORで区切らANDのグループで構成されています。 私が探しているのは、論理式を配布できるライブラリです。 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.pypip 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

私は受け入れる答えを選択しなければなりませんでした。あなたの答えも受け入れられます。私は@ BPLが示唆したようにSympyを使うほうが好きです。ご助力ありがとうございます。 – Dionys

+1

@Dionysはい、私はSympyの答えがより有用であると思います。なぜなら、これははるかに一般的なライブラリ(私はそれがブール代数を実装していることに気付いていなかったからです)です。 – jdehesa

関連する問題