間違っていることを証明してください!


22

前書き

人生におけるあなたの使命は簡単です:インターネット上で人々を間違って証明してください!
これを行うには、通常、それらのステートメントを慎重に分析し、それらの矛盾を指摘します。
これを自動化する時が来ましたが、私たちは怠け者なので、可能な限り少ない労力(読み:最短のコード)で人々が間違っていることを証明したいと思います。

仕様

入力

入力は、連言標準形の式になります。この形式については、言語のニーズに応じて、以下の形式を使用するか、独自の形式を定義できます(ただし、純粋なCNF以外の形式でエンコードすることはできません)。ただし、テストケース(ここ)は以下の形式で提供されます(ただし、独自のテストケースを生成するのはそれほど難しくありません)。

入力は、変数のリストのリストになります(文字列として読むことも、文字列を要求することもできます)。入力は、それぞれが2つのリストのリストである一連の節として記述された、連言標準形(CNF)の式です。句の最初のリストは正のリテラル(変数)をエンコードし、2番目のリストは負の(否定)リテラル(変数)をエンコードします。句のすべての変数は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」になるようにすべての変数にtrueとfalseの割り当てがあるかどうかを確認します。数式が満足できる場合は「true」、そうでない場合は「false」になります。
おもしろい事実:これは一般的な場合のNP完全問題です。
注:真理値表を生成し、結果のエントリが真であるかどうかを確認することは許可されています。

コーナーケース

空の第3レベルのリストを取得した場合、その句にはそのような(正/負)変数はありません-有効な入力です。
必要に応じて、他のコーナーケースを未定義のままにすることができます。
空の式(1番目のレベルのリスト)でtrueを返し、空の句(2番目のレベルのリスト)で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番目のテストケースはtrueを返すはずです。(P、Q)=(1,1)と(P、Q、R、S、T)=(0,0,0,0,0)を代入してみましたが、両方とも真であることがわかったため、少なくとも1つは存在するはずです式が真の場合。
busukxuan

@ busukxuan、3番目と4番目が間違いであることは100%確信しています。3):これは{{P,Q},{P,!Q},{!P,Q},{!P,!Q}}(この順序ではありません)簡単に表示できるのは矛盾です。4)の場合:これはP AND ... AND (NOT P)、Pの値に対して明らかに決して
成り立た

2
面白いことに、コードを書くのにもっと短いコードが実際に必要です。
-user6245072

回答:


41

Mathematica、12バイト

SatisfiableQ

さて、組み込みの...

入力形式はAnd[Or[a, b, Not[c], Not[d]], Or[...], ...]です。これはありませんので、空の部分式のために正しく作品をOr[]あるFalseAnd[]されますTrue

レコードの場合、チャレンジからリストベースのフォーマットを受け取り、変換自体を行うソリューションは44バイトですが、OPはコメントで、追加情報をエンコードしない限りどのフォーマットでも問題ないことを明確にしました。

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

18
なぜならMathematica ...
Leaky Nun

11
Mathematicaには非常に多くの組み込み._があります。
TuxCrafting

3
@TùxCräftîñg 確かに
jpmc26

15
ほんの一瞬、この答えはあいまいで、スタックベースのエソランで書かれていて、たまたまコマンドシーケンスで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で試してみてください。このアルゴリズムは、すべての変数の割り当てを単に試行し、そのうちの1つが式を満たすかどうかを確認します。

入力はの形式になって[([],["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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.