Доведіть мене неправильно!


22

Вступ

Ваша місія в житті проста: доведіть людей неправильно в Інтернеті!
Для цього ви зазвичай ретельно аналізуєте їхні твердження та вказуєте на суперечність у них.
Настав час автоматизувати це, але, як ми лінуємось, ми хочемо довести людей неправильно з найменшими зусиллями (читайте: найкоротший код).

Специфікація

Вхідні дані

Вашим вкладом буде формула у сполучній нормальній формі . Для формату ви можете використовувати нижченаведений формат або визначити свій власний, відповідно до потреб вашої мови (ви не можете кодувати більше у форматі, ніж чистий 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)

1
Чи можемо ми взяти вклад як (A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))?
Адам

1
@ Adám, як зазначено в виклику, формат повністю залежить від вас, якщо він не кодує більше інформації, ніж на основі списку. (Наприклад, рецептура, яку ви надали, повністю дозволена)
SEJPM

@SEJPM Якщо я правильно розумію позначення, я думаю, що 3-й і 4-й тестові випадки повинні повернути істину. Я спробував замінити (P, Q) = (1,1) і (P, Q, R, S, T) = (0,0,0,0,0) і виявив і те, і інше, тому має бути принаймні один випадок, коли вираз є істинним.
busukxuan

@busukxuan, я на 100% впевнений, що третій та четвертий - неправдиві. Для 3): це {{P,Q},{P,!Q},{!P,Q},{!P,!Q}}(не в цьому порядку), що може бути легко показано - це суперечність. Для 4): Це тривіально протиріччя, оскільки воно, P AND ... AND (NOT P)очевидно, ніколи не може бути правдивим для будь-якого значення P.
SEJPM

2
Смішно, наскільки коротший код насправді вимагає докладати більше зусиль.
user6245072

Відповіді:


41

Математика, 12 байт

SatisfiableQ

Ну, є вбудований ...

Формат вводу є And[Or[a, b, Not[c], Not[d]], Or[...], ...]. Це робить роботу правильно для порожнього подвираженія, тому що Or[]це Falseі And[]є True.

Для запису, рішення, яке отримує формат на основі списку від виклику і здійснює саме перетворення, становить 44 байти, але ОП уточнив у коментарі, що будь-який формат добре, доки він не кодує додаткової інформації:

SatisfiableQ[Or@@Join[#,Not/@#2]&@@@And@@#]&

18
Тому що Mathematica ...
Leaky Nun

11
Mathematica дійсно має божевільну кількість вбудованих ._.
TuxCrafting

3
@ TùxCräftîñg Дійсно .
jpmc26

15
На частку секунди я подумав, що ця відповідь була написана в незрозумілому, складеному на основі esolang, де випадково командна послідовність S a t i s f i a b l e Qвирішить проблему. Лише тоді, розуміння читання постукало у двері ...
ojdo

3

Haskell, 203 200 байт

t=1<3
e%((t,f):r)=or((e<$>t)++map(not.e)f)&&e%r
e%_=t
u v b e s|s==v=b|t=e s
s e[]c=1<0
s e(v:w)c=e%c||s(u v t e)w c||s(u v(1<0)e)w c
g v[]=v
g v((t,f):r)=g(v++[x|x<-t++f,notElem x v])r
g[]>>=s(\x->t)

Цей виклик заслуговує на відсутність вбудованої відповіді, тож ось вам. Спробуйте це на ideone . Алгоритм просто пробує всі змінні призначення і перевіряє, чи відповідає одне з них формулою.

Введення у формі [([],["P","Q"]),(["Q","P"],[]),(["P"],["Q"]),(["Q"],["P"])], хоча замість рядків буде працювати кожен тип з рівністю.

Невикористаний код:

type Variable   = String
type CNF        = [([Variable], [Variable])]
type Evaluation = (Variable -> Bool)

satisfies :: Evaluation -> CNF -> Bool
satisfies eval [] = True
satisfies eval ((t,f):r) = or(map eval t ++ map (not.eval) f) && satisfies eval r

update :: Evaluation -> Variable -> Bool -> Evaluation
update eval s b var = if var == s then b else eval var

search :: Evaluation -> [Variable] -> CNF -> Bool
search eval [] cnf = False
search eval (v:vars) cnf = satisfies eval cnf || search (update eval v True) vars cnf || search (update eval v False) vars cnf 

getVars :: CNF -> [Variable] -> [Variable]
getVars [] vars = vars
getVars ((t,f):cnf) vars = getVars cnf (vars ++ [v |v<-(t++f), notElem v vars])

isSat :: CNF -> Bool
isSat cnf = search (\x->True) (getVars cnf []) cnf

1

JavaScript 6, 69B

x=>f=(v,e)=>(e=v.pop())?[0,1].some(t=>f([...v],eval(e+'=t'))):eval(x)

Використання:

f('a|b')(['a','b'])
true
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.