Introducción
Tu misión en la vida es simple: ¡Demuestra que las personas están equivocadas en Internet!
Para hacer esto, generalmente analiza cuidadosamente sus declaraciones y señala la contradicción en ellas.
Es hora de automatizar esto, pero como somos flojos, queremos demostrar que las personas están equivocadas con el menor esfuerzo posible (léase: el código más corto) posible.
Especificación
Entrada
Su entrada será una fórmula en forma conjuntiva normal . Para el formato, puede usar el siguiente formato o definir el suyo, según las necesidades de su idioma (aunque no puede codificar más en el formato que el CNF puro). Sin embargo, los casos de prueba (aquí) se proporcionan en el siguiente formato (aunque no será demasiado difícil generar el suyo).
Su entrada será una lista de una lista de una lista de variables (también puede leerla como cadenas / requerir cadenas). La entrada es una fórmula en forma normal conjuntiva (CNF) escrita como un conjunto de cláusulas, cada una de las cuales es una lista de dos listas. La primera lista en la cláusula codifica los literales positivos (variables), la segunda lista codifica los literales (variables) negativos (negados). Cada variable en la cláusula se OR 'juntas y todas las cláusulas se AND' juntas.
Para hacerlo más claro: [[[A,B],[C]],[[C,A],[B]],[[B],[A]]]
puede leerse como:
(A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))
Salida
La salida es booleana, por ejemplo, algún valor verdadero o algún valor falso.
¿Qué hacer?
Es simple: verifique si la fórmula dada a mano es satisfactoria, por ejemplo, si existe alguna asignación de verdadero y falso a todas las variables, de modo que la fórmula general arroje "verdadero". Su salida será "verdadera" si la fórmula es satisfactoria y "falsa" si no lo es.
Dato curioso: este es un problema NP-completo en el caso general.
Nota: Se permite generar una tabla de verdad y verificar si alguna entrada resultante es verdadera.
Casos de esquina
Si obtiene una lista vacía de tercer nivel, entonces no hay tal variable (positiva / negativa) en esa cláusula: una entrada válida.
Puede dejar otros casos de esquina sin definir si lo desea.
También puede devolver verdadero en una fórmula vacía (lista de primer nivel) y falso en una cláusula vacía (lista de segundo nivel).
¿Quién gana?
Este es el código de golf, por lo que gana la respuesta más corta en bytes.
Se aplican reglas estándar, por supuesto.
Casos de prueba
[[[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}}
(no en este orden) que se puede mostrar fácilmente es una contradicción. Para el 4): Esto es trivialmente una contradicción porque es lo P AND ... AND (NOT P)
que obviamente nunca puede ser cierto para ningún valor de P.
(A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))
?