介绍
您的人生使命很简单:在互联网上证明人们做错了!
为此,您通常会仔细分析他们的陈述并指出他们之间的矛盾。
现在该使它自动化了,但是由于我们很懒惰,所以我们希望以最小的努力(最短代码)证明人们是错误的。
规格
输入项
您的输入将是合取范式的公式。对于格式,可以根据您的语言需要使用以下格式或定义自己的格式(不过,您可以使用的格式编码不能超过纯CNF)。但是,测试用例(此处)以以下格式提供(尽管生成您自己的用例并不难)。
您的输入将是一个变量列表的列表(您也可以将其读为字符串/需要字符串)。输入是合取范式(CNF)的公式,写为一组子句,每个子句都是两个列表的列表。子句中的第一个列表对正文字(变量)进行编码,第二个列表对负(负)文字(变量)进行编码。子句中的每个变量都进行“或”运算,所有子句都进行“与”运算。
更清楚地说:[[[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”,否则为“ false”。
事实:在一般情况下,这是一个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)
{{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))
吗?