Цель:
Напишите полную программу или функцию, которая принимает формулу в логике высказываний (далее называемую логическим выражением или выражением ) и выводит эту формулу в конъюнктивной нормальной форме . Есть две константы, ⊤
и ⊥
представляющих истинные и ложные, унарный оператор , ¬
представляющий отрицание и бинарные операторы ⇒
, ⇔
, ∧
, и ∨
представляющих импликации, эквивалентности, конъюнкции и дизъюнкции, соответственно , которые подчиняются все обычные логические операции ( закон де Моргана , устранение двойного отрицания , так далее.).
Конъюнктивная нормальная форма определяется следующим образом:
- Любое атомное выражение (в том числе
⊤
и⊥
) находится в конъюнктивной нормальной форме. - Отрицание любого ранее построенного выражения находится в конъюнктивной нормальной форме.
- Дизъюнкция любых двух ранее построенных выражений имеет конъюнктивную нормальную форму.
- Конъюнкция любых двух ранее построенных выражений имеет конъюнктивную нормальную форму.
- Любое другое выражение не в соединительной нормальной форме.
Любое логическое выражение может быть преобразовано (не однозначно) в логически эквивалентное выражение в конъюнктивной нормальной форме (см. Этот алгоритм ). Вам не нужно использовать этот конкретный алгоритм.
Входные данные:
Вы можете принять участие в любом удобном формате; например, символическое логическое выражение (если ваш язык поддерживает это), строка, некоторая другая структура данных. Вам не нужно использовать те же символы для истинных, ложных и логических операторов, что и здесь, но ваш выбор должен быть последовательным, и вы должны объяснить свой выбор в своем ответе, если он неясен. Вы не можете принимать любые другие входные данные или кодировать любую дополнительную информацию в своем формате ввода. У вас должен быть какой-то способ выражения произвольного числа атомарных выражений; например, целые числа, символы, строки и т. д.
Вывод:
Формула в соединительной нормальной форме, опять же в любом удобном формате. Он не обязательно должен быть в том же формате, что и ваши входные данные, но вы должны объяснить, есть ли различия.
Тестовые случаи:
P ∧ (P ⇒ R) -> P ∧ R
P ⇔ (¬ P) -> ⊥
(¬ P) ∨ (Q ⇔ (P ∧ R)) -> ((¬ P) ∨ ((¬ Q) ∨ R)) ∧ ((¬ P) ∨ (Q ∨ (¬ R)))
Ноты:
- Если входное выражение является тавтологией,
⊤
будет правильным выводом. Точно так же, если входное выражение является противоречием,⊥
будет допустимым выводом. - Оба ваших формата ввода и вывода должны иметь четко определенный порядок операций, способный выразить все возможные логические выражения. Вам могут понадобиться какие-то круглые скобки.
- Вы можете использовать любой четко определенный выбор инфиксной, префиксной или постфиксной нотации для логических операций. Если ваш выбор отличается от стандартного (отрицание - префикс, остальные - инфикс), объясните это в своем ответе.
- Конъюнктивная нормальная форма не уникальна в целом (даже до переупорядочения). Вам нужно только вывести на действительную форму.
- Однако вы представляете атомарные выражения, они должны отличаться от логических констант, операторов и символов группировки (если они у вас есть).
- Разрешены встроенные модули, которые вычисляют конъюнктивную нормальную форму.
- Стандартные лазейки запрещены.
- Это код-гольф ; кратчайший ответ (в байтах) выигрывает.
P
и (P ∨ Q) ∧ (P ∨ (¬Q))
оба в соединительной нормальной форме.