前書き
人生におけるあなたの使命は簡単です:インターネット上で人々を間違って証明してください!
これを行うには、通常、それらのステートメントを慎重に分析し、それらの矛盾を指摘します。
これを自動化する時が来ましたが、私たちは怠け者なので、可能な限り少ない労力(読み:最短のコード)で人々が間違っていることを証明したいと思います。
仕様
入力
入力は、連言標準形の式になります。この形式については、言語のニーズに応じて、以下の形式を使用するか、独自の形式を定義できます(ただし、純粋な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)
{{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))
ますか?