Diferencia entre 3-SAT y CNF
Intento resolver el problema SAT en sintaxis SMT-LIB utilizando el solucionador de teoremas Z3.
Necesito escribir una fórmula proposicional en CNF y encontrar los valores satisfactorios.
Entiendo los conceptos pero no entiendo la implementación. ¿Podría darme un ejemplo sobre el problema 3-SAT resuelto por los provers de teoremas Z3?
Gracias.
davy.ai
¡Claro!
Primero, debemos definir qué es un problema de 3-SAT. Es un problema en el que tienes una fórmula booleana que consta de cláusulas que cada una tiene exactamente tres literales. Por ejemplo, una instancia de un problema de 3-SAT podría ser:
(a OR b OR NOT c) AND (NOT a OR b OR c) AND (a OR NOT b OR c)
El objetivo es determinar si hay un conjunto de valores de verdad para las variables
a
,b
yc
tal que toda la fórmula se evalúe comotrue
.Para resolver esto usando Z3, primero necesitamos convertir la fórmula a forma CNF. CNF significa Forma Normal Conjuntiva, y simplemente significa que la fórmula está escrita como una conjunción (AND) de una o más cláusulas, donde cada cláusula es una disyunción (OR) de uno o más literales. Podemos convertir nuestra fórmula de 3-SAT a forma CNF de la siguiente manera:
Ahora que tenemos nuestra fórmula en forma CNF, podemos usar Z3 para encontrar una asignación satisfactoria de variables. Aquí hay un ejemplo de un programa en Python que hace exactamente eso:
Cuando ejecutamos este programa, deberíamos obtener una salida que se ve algo así:
Esto significa que la fórmula es satisfacible y podemos asignar
a
aTrue
,b
aFalse
yc
aTrue
para que toda la fórmula se evalúe comotrue
.