Поздний ответ. Недавно я узнал больше о алгоритме Куайна-МакКласки и картах Карно , которые являются систематическими подходами к имитации булевых выражений.
Я наткнулся на эту реализацию Python , которая казалась приятной и подумала, что проверю свой более ранний ответ, используя ее:
import logic
A,B,C,D = logic.bools('ABCD')
print logic.boolsimp((A & B) | (A & ~C) | (B & ~D))
Конечно, он печатает
(B & ~D) | (~C & A) | (B & A)
Pythonists: не обращайте внимания на странный выбор операторов для логических операций; это в основном связано с тем, что and
, or
и not
не могут быть перегружены в Python
Проверка работоспособности
В качестве проверки работоспособности я проверил, что эквивалентность, которая, по моему мнению, приведет к потенциальному упрощению, была " видимой " реализацией алгоритма:
print logic.boolsimp((A & B) | (A & ~C))
print logic.boolsimp(A & (B | ~C))
печатает дважды одинаковый вывод ((~C & A) | (B & A)
)