Мета:
Напишіть повну програму або функцію, яка приймає формулу в пропозиційній логіці (відтепер її називають логічним виразом або виразом ) і виводить цю формулу у сполучній нормальній формі . Є дві константи, ⊤
і ⊥
які представляють справжні і несправжні, унарний оператор , ¬
який представляє заперечення і бінарні оператори ⇒
, ⇔
, ∧
, і ∨
представляють імплікації, еквівалентності, кон'юнкції і диз'юнкції, відповідно , які підпорядковуються всі звичайні логічні операції ( закон де Моргана , усунення подвійного заперечення тощо).
Норма кон'юнктивної форми визначається так:
- Будь-який атомний вираз (включаючи
⊤
і⊥
) має кон'юнктивну нормальну форму. - Заперечення будь-якого раніше побудованого виразу має кон'юнктивну нормальну форму.
- Диз'юнкція будь-яких двох раніше побудованих виразів є у сполучній нормальній формі.
- Сполучення будь-яких двох раніше побудованих виразів має кон'юнктивну нормальну форму.
- Будь-який інший вираз не є в сполучній нормальній формі.
Будь-який логічний вираз може бути перетворений (неоднозначно) у логічно еквівалентний вираз у сполучній нормальній формі (див. Цей алгоритм ). Вам не потрібно використовувати саме цей алгоритм.
Вхід:
Ви можете приймати дані в будь-якому зручному форматі; наприклад, символічний логічний вираз (якщо ваша мова його підтримує), рядок, якась інша структура даних. Вам не потрібно використовувати ті самі символи для істинних, хибних та логічних операторів, як я, але ваш вибір повинен бути послідовним, і ви повинні пояснити свій вибір у своїй відповіді, якщо це не зрозуміло. Ви не можете приймати будь-який інший вхід або кодувати будь-яку додаткову інформацію у форматі введення. Ви повинні мати певний спосіб вираження довільної кількості атомних виразів; наприклад цілі числа, символи, рядки тощо
Вихід:
Формула в кон'юнктивному звичайному вигляді, знову в будь-якому зручному форматі. Він не повинен бути у тому ж форматі, що і ваш вхід, але слід пояснити, чи є якісь відмінності.
Тестові приклади:
P ∧ (P ⇒ R) -> P ∧ R
P ⇔ (¬ P) -> ⊥
(¬ P) ∨ (Q ⇔ (P ∧ R)) -> ((¬ P) ∨ ((¬ Q) ∨ R)) ∧ ((¬ P) ∨ (Q ∨ (¬ R)))
Примітки:
- Якщо вхідний вираз є тавтологією,
⊤
було б допустимим висновком. Аналогічно, якщо вхідний вираз є суперечливим,⊥
був би коректним результатом. - І вхідні, і вихідні формати повинні мати чітко визначений порядок операцій, здатний виражати всі можливі логічні вирази. Можливо, вам знадобляться круглі дужки.
- Ви можете використовувати будь-який чітко визначений вибір інфіксації, префікса чи позначення постфіксу для логічних операцій. Якщо ваш вибір відрізняється від стандартного (заперечення - префікс, решта - інфікс), будь ласка, поясніть це у своїй відповіді.
- Сполучна нормальна форма взагалі не є унікальною (навіть не до переупорядкування). Вам потрібно лише вивести на дійсну форму.
- Однак ви представляєте атомні вирази, вони повинні відрізнятися від логічних констант, операторів та символів групування (якщо вони є).
- Вбудовані модулі, які обчислюють нормальну сполучну форму.
- Стандартні лазівки заборонені.
- Це код-гольф ; найкоротша відповідь (у байтах) виграє.
P
і (P ∨ Q) ∧ (P ∨ (¬Q))
обидва є у сполучній нормальній формі.