代码之家  ›  专栏  ›  技术社区  ›  Dionys

分布布尔逻辑表达式

  •  3
  • Dionys  · 技术社区  · 7 年前

    我拥有的:

    (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 回复  |  直到 7 年前
        1
  •  2
  •   BPL    7 年前

    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
    
        2
  •  2
  •   javidcf    7 年前

    boolean.py (从Pip安装 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')
      )
    )