Существует много литературы по тому, как делать это вручнуюсм. карты Карно.Вы можете автоматизировать один из этих методов.
Но, по сути, вы хотите построить наивное логическое уравнение, представляющее вашу таблицу истинности, а затем применить к этому уравнению символический логический упрощитель (или минимизатор)языковые синтезаторы делают это как часть процесса генерации кода).
Построить наивное уравнение легко: создайте конъюнкцию для каждой строки таблицы истинности, которая дает истину, и возьмите дизъюнкцию всех конъюнкций.Ваша первая таблица выдаст наивное уравнение:
(~a & ~b) | (a & ~b)
Если вы примените к этому логическое упрощение:
((~a | a) & ~b) // combine terms
(TRUE & ~b ) // consequence of ~a | a
~b // the answer
Ваша вторая таблица выдаст наивное уравнение:
(~a & b) | (a & ~b )
Что не упрощает далее.
Вы можете использовать систему программной трансформации , чтобы выполнить это.Такая система обычно позволяет вам определить синтаксический анализатор для вашего входного языка (в данном случае таблиц истинности), а также определить преобразования из вашего входного языка в выходной язык и дополнительные преобразования в выходном языке.Ваше преобразование ввода-вывода будет отображать запись таблицы истинности в запись булевого уравнения.Преобразования в булевых уравнениях будут тогда выполнять упрощения.
После того, как вы получите упрощенную формулу, вы захотите применить еще один набор преобразований для отображения из чистой булевой алгебры в ваш конечный компьютерный язык, в вашем случае, PHP.
Подобные вещи мы делали довольно часто с нашим DMS Software Reengineering Toolkit .DMS помогает справиться с этой проблемой: она понимает ассоциированные и коммутативные алгебраические перезаписи, что делает создание уравнений упрощения проще и надежнее перед лицом сложных формул.
Мы применили DMS к алгебраическим логическим формулам с буквально сотнями тысяч литералов (в форме A или ~ A) в ряде случаев.Одним из примеров был генератор кода, который принимал описание того, как управлять фабрикой (буквально) с точки зрения датчиков (чтение заводского состояния) и исполнительных механизмов (вещи, которые изменяют фабричное состояние), генерировать уравнения, упрощать их, а затем переводитьих можно использовать для нескольких разных целевых компьютерных языков для промышленных контроллеров, называемых ПЛК.
Вы можете увидеть пример не логического упрощения, а реального алгебраического упрощения с использованием DMS.Булево упрощение проще написать: -}