es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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 y c tal que toda la fórmula se evalúe como true.

    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:

    (NOT a OR NOT b OR NOT c) AND (NOT a OR b OR c) AND (a OR NOT b OR c) AND (a OR b OR NOT c)
    

    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:

    from z3 import *
    
    a, b, c = Bools('a b c')
    
    # nuestra fórmula en CNF
    f = And(Or(Not(a), Not(b), Not(c)), Or(Not(a), b, c), Or(a, Not(b), c), Or(a, b, Not(c)))
    
    s = Solver()
    s.add(f)
    
    # verifica si la fórmula es satisfacible e imprime un modelo si lo es
    if s.check() == sat:
        m = s.model()
        print("a =", m.evaluate(a))
        print("b =", m.evaluate(b))
        print("c =", m.evaluate(c))
    else:
        print("insatisfacible")
    

    Cuando ejecutamos este programa, deberíamos obtener una salida que se ve algo así:

    a = True
    b = False
    c = True
    

    Esto significa que la fórmula es satisfacible y podemos asignar a a True, b a False y c a True para que toda la fórmula se evalúe como true.

Comments are closed.