Encontrar contraejemplos para un objeto solucionador “Horn”.
Estoy tratando de aprender cómo escribir código para proporcionar un contraejemplo a una cláusula de Horn y su interpretación adivinada. En el código siguiente, sea I la función no interpretada (es una invarianza de bucle trivial). Las primeras 3 s.add() agregan los requisitos de condición para I(x), y la cuarta es una suposición candidata para I. Intento usar la instrucción s.prove para obtener un contraejemplo a mi suposición adivinada para I. Parece que estoy obteniendo un gran registro de errores al ejecutar este código, ¿alguien podría decirme qué está mal?
s = SolverFor("HORN")
I = Function('I', IntSort(), BoolSort())
x, x2 = Ints('x x2')
s.set("produce-proofs", True)
s.add(ForAll([x], Implies(x == 0, I(x))))
s.add(ForAll([x, x2], Implies(And(I(x), x2 == x + 1, x < 5), I(x2))))
s.add(ForAll([x], Implies(And(I(x), Not(x < 5)), x == 5)))
s.add(ForAll([x], And(Implies(I(x), x == 2), Implies(x == 2, I(x)))))
# ¡Añadiendo invariante adivinado aquí!
assert unsat == s.check()
print(s.proof())
davy.ai
Hay un par de problemas con el código proporcionado:
unsat
no está definida. Esto causaría un NameError al ejecutar el código.assert unsat == s.check()
asume que el solucionador debe producir un resultado de insatisfacibilidad, lo cual puede no ser el caso. Dependiendo de la entrada, el solucionador puede producir satisfacibilidad o desconocido como resultado. Es mejor verificar el resultado devuelto pors.check()
y manejarlo en consecuencia.ForAll
. La condiciónImplies( I(x) , (x == 2) )
debería serImplies( I(x) , (x2 == 2) )
.Aquí hay una versión corregida del código:
Esta versión verifica el resultado devuelto por
s.check()
e imprime la prueba solo si devuelveunsat
. Si el resultado essat
ounknown
, imprime el resultado del solucionador.