Yanıldığımı ispat et!


22

Giriş

Hayattaki göreviniz basit: İnternette yanlış olduğunu kanıtlayın!
Bunu yapmak için genellikle ifadelerini dikkatlice analiz eder ve içlerindeki çelişkiyi belirtirsiniz.
Bunu otomatikleştirmenin zamanı geldi, ancak tembel olduğumuz için, mümkün olan en az çabayla (okuma: en kısa kod) insanları yanlış kanıtlamak istiyoruz.

Şartname

Giriş

Girişiniz normal normal formda bir formül olacaktır . Format için, aşağıdaki formatı kullanabilir veya kendi dilinizi, kendi dilinizin ihtiyaçlarına göre tanımlayabilirsiniz (formatta saf CNF'den daha fazla kodlayamayabilirsiniz). Bununla birlikte, test senaryoları (burada) aşağıdaki formatta verilmiştir (kendinizinkini oluşturmak çok zor olmasa da).

Girişiniz bir değişkenler listesinin listesi olacaktır (dizeleri de okuyabilirsiniz / dizeleri de isteyebilirsiniz). Bu girdi , her biri iki listenin bir listesi olan bir dizi cümle olarak yazılmış, konjonktif normal formda (CNF) bir formüldür . Maddede ilk liste olumlu değişmezleri (değişkenler), ikinci liste olumsuz (olumsuzlanmış) değişmezleri (değişkenleri) kodlar. Maddede her değişken birlikte OR'lü ve tüm maddeler birlikte AND'lu.

Netleştirmek için: [[[A,B],[C]],[[C,A],[B]],[[B],[A]]]olarak okunabilir:
(A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))

Çıktı

Çıktı boolean, örneğin, bazı truthy değeri veya bazı falsy değeri.

Ne yapalım?

Çok basit: Eldeki formülün tatmin edici olup olmadığını kontrol edin; örneğin, genel formülün "true" vereceği şekilde tüm değişkenlere bazı doğru ve yanlış atamalarının olup olmadığını kontrol edin. Çıktı, formül doyurucuysa "true", değilse doyurucu "false" olacaktır.
Eğlence Gerçeği: Bu, genel durum için NP tamamlayıcı bir sorundur.
Not: Bir doğruluk tablosu oluşturmak ve elde edilen herhangi bir girişin doğru olup olmadığını kontrol etmek mümkündür.

Köşe Kılıfları

Boş bir 3. seviye listesi alırsanız, o maddede böyle bir (pozitif / negatif) değişken yoktur - geçerli bir giriş.
İsterseniz diğer köşe kılıflarını tanımsız bırakabilirsiniz.
Ayrıca boş bir formülde (1. seviye listesi) true ve boş bir maddeye (2. seviye listesi) yanlış dönebilirsiniz.

Kim kazanır?

Bu kod-golf yani bayt cinsinden en kısa cevap kazanır!
Standart kurallar elbette geçerlidir.

Test-vakalar

[[[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
Girdi olarak alabilir miyiz (A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))?
Adám

1
@ Adám, mücadelede belirtildiği gibi, listeye dayalı olandan daha fazla bilgi kodlamadığı sürece, format tamamen size bağlıdır. (Örneğin, verdiğiniz formüle tamamen izin verilir)
SEJPM

@ SEJPM Gösterimi doğru anladıysam, 3. ve 4. test vakalarının doğru olması gerektiğini düşünüyorum. (P, Q) = (1,1) ve (P, Q, R, S, T) = (0,0,0,0,0) değiştirmeyi denedim ve her ikisini de doğru buldum, bu yüzden en azından bir tane olmalı ifadenin doğru olduğu durumda.
busukxuan

@ busukxuan, üçüncü ve dördüncü birinin yanlış olduğuna% 100 eminim. 3 için): Bu {{P,Q},{P,!Q},{!P,Q},{!P,!Q}}(bu sırada değil) kolayca gösterilebilecek olan bir çelişkidir. 4): Bu önemsiz bir çelişki çünkü P AND ... AND (NOT P)P'nin hiçbir değeri için kesinlikle doğru olamayacak bir şey.
SEJPM

2
Komik ne kadar kısa kod aslında yazmak için daha fazla çaba gerektirir.
user6245072

Yanıtlar:


41

Mathematica, 12 bayt

SatisfiableQ

Şey, bir yerleşik var ...

Giriş formatı And[Or[a, b, Not[c], Not[d]], Or[...], ...]. Bu , boş alt ifadeler için doğru çalışır, çünkü Or[]öyle Falseve And[]öyledir True.

Kayıt için, listeden gelen formatı zorlamadan alan ve dönüşümün kendisini yapan bir çözüm 44 bayttır, ancak OP, herhangi bir ek bilgiyi kodlamadığı sürece herhangi bir formatın iyi olduğunu yorumunda açıkladı:

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

18
Çünkü Mathematica ...
Sızdıran Rahibe

11
Mathematica'da gerçekten çok fazla sayıda yerleşik yapı vardır.
TuxCrafting

3
@ TùxCräftîñg Gerçekten .
jpmc26

15
Bölünmüş saniye için, bu cevabın, yalnızca şans eseri olarak komut dizisinin S a t i s f i a b l e Qsorunu çözeceği belirsiz, yığılmış bir esolang ile yazılmış olduğunu düşündüm . Ancak o zaman, okuduğunu anlama kapısını çaldı ...
ojdo

3

Haskell, 203 200 bayt

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)

Bu zorluk, yerleşik olmayan bir cevabı hak ediyor, işte başlıyorsunuz. İdeone üzerinde deneyin . Algoritma basitçe tüm değişken atamalarını dener ve içlerinden birinin formülü sağlayıp sağlamadığını kontrol eder.

Girdi biçimindedir [([],["P","Q"]),(["Q","P"],[]),(["P"],["Q"]),(["Q"],["P"])], ancak karakter dizileri yerine her tür eşitlikle çalışacaktır.

Ungolfed kod:

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)

Kullanımı:

f('a|b')(['a','b'])
true
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.