Вступ
Ваша місія в житті проста: доведіть людей неправильно в Інтернеті!
Для цього ви зазвичай ретельно аналізуєте їхні твердження та вказуєте на суперечність у них.
Настав час автоматизувати це, але, як ми лінуємось, ми хочемо довести людей неправильно з найменшими зусиллями (читайте: найкоротший код).
Специфікація
Вхідні дані
Вашим вкладом буде формула у сполучній нормальній формі . Для формату ви можете використовувати нижченаведений формат або визначити свій власний, відповідно до потреб вашої мови (ви не можете кодувати більше у форматі, ніж чистий CNF, хоча). Проте тестові приклади (тут) надаються у форматі нижче (хоча це не буде надто важко створити ваш власний).
Вашим вкладом буде список списку змінних (ви також можете прочитати його як рядки / потрібні рядки). Вхід - це формула в кон'юнктивному звичайному вигляді (CNF), записана у вигляді набору пропозицій, кожен із яких складається з двох списків. Перший список у пункті кодує позитивні літерали (змінні), другий список кодує негативні (заперечені) літерали (змінні). Кожна змінна в пункті OR'ed разом, і всі пропозиції є AND'ed разом.
Щоб було зрозуміліше: [[[A,B],[C]],[[C,A],[B]],[[B],[A]]]
його можна прочитати як:
(A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))
Вихідні дані
Вихід є булевим, наприклад, або якоюсь основною цінністю або хибним значенням.
Що робити?
Це просто: Перевірте, чи відповідає формула, подана під рукою, наприклад, чи існує якесь присвоєння істинних та хибних всім змінним, таким чином, що загальна формула дає "істину". Ваш результат буде "істинним", якщо формула може бути визначена і "помилковим", якщо це не так.
Факт веселощів: Це загальна проблема NP в загальному випадку.
Примітка: генерування таблиці істинності та перевірка того, чи є будь-який результуючий запис істинним, дозволено.
Кутові справи
Якщо ви отримаєте порожній список 3-го рівня, то в цьому пункті немає такої (позитивної / негативної) змінної - допустимого вводу.
Ви можете залишити інші кутові шафи невизначеними, якщо хочете.
Ви також можете повернути true за порожньою формулою (список першого рівня) та false за порожнім пунктом (список другого рівня).
Хто виграє?
Це код-гольф, тому найкоротша відповідь у байтах виграє!
Звичайно, застосовуються стандартні правила.
Тестові кейси
[[[P],[Q,R]],[[Q,R],[P]],[[Q],[P,R]]] -> true
[[[],[P]],[[S],[]],[[R],[P]],[[U],[Q]],[[X],[R]],[[Q],[S]],[[],[P,U]],[[W],[Q,U]]] -> true
[[[],[P,Q]],[[Q,P],[]],[[P],[Q]],[[Q],[P]]] -> false
[[[P],[]],[[],[P,S]],[[P,T],[]],[[Q],[R]],[[],[R,S]],[[],[P,Q,R]],[[],[P]]] -> false
optional behavior (not mandatory, may be left undefined):
[] -> true (empty formula)
[[]] -> false (empty clause)
[[[],[]]] -> false (empty clause)
{{P,Q},{P,!Q},{!P,Q},{!P,!Q}}
(не в цьому порядку), що може бути легко показано - це суперечність. Для 4): Це тривіально протиріччя, оскільки воно, P AND ... AND (NOT P)
очевидно, ніколи не може бути правдивим для будь-якого значення P.
(A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))
?