Введение
Ваша жизненная миссия проста: докажите, что люди не правы в Интернете!
Для этого вы обычно тщательно анализируете их высказывания и указываете на противоречие в них.
Пришло время автоматизировать это, но, поскольку мы ленивы, мы хотим доказать, что люди ошибаются с минимальными усилиями (читай: самый короткий код).
Спецификация
вход
Ваш вклад будет формулой в соединительной нормальной форме . Для этого формата вы можете использовать приведенный ниже формат или определить свой собственный, исходя из потребностей своего языка (хотя вы не можете кодировать больше в формате, чем чистый CNF). Тем не менее, тестовые случаи (здесь) представлены в следующем формате (хотя это не будет слишком сложно для создания собственного).
Ваш ввод будет представлять собой список из списка переменных (вы также можете читать его как строки / требовать строки). Входные данные представляют собой формулу в конъюнктивной нормальной форме (CNF), записанную в виде набора предложений, каждое из которых представляет собой список из двух списков. Первый список в предложении кодирует положительные литералы (переменные), второй список кодирует отрицательные (отрицательные) литералы (переменные). Каждая переменная в предложении объединяется в OR, а все предложения объединяются в AND.
Чтобы было понятнее: [[[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))
Выход
Вывод логический, например, какое-то истинное значение или некоторое ложное значение.
Что делать?
Все просто: проверьте, удовлетворяет ли приведенная формула, например, существует ли какое-либо присвоение true и false всем переменным, так что общая формула выдает «true». Ваш вывод будет "true", если формула satiesfiable, и "false", если это не так.
Интересный факт: это NP-полная задача в общем случае.
Примечание: создание таблицы истинности и проверка, является ли какая-либо результирующая запись истинной, разрешено.
Угловые чехлы
Если вы получите пустой список 3-го уровня, то в этом предложении нет такой (положительной / отрицательной) переменной - допустимого ввода.
Вы можете оставить другие угловые случаи неопределенными, если хотите.
Вы также можете вернуть true для пустой формулы (список 1-го уровня) и false для пустого предложения (список 2-го уровня).
Кто выигрывает?
Это код-гольф, поэтому выигрывает самый короткий ответ в байтах!
Стандартные правила применяются конечно.
Тест-кейсы
[[[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))
?