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.

Resultado incorrecto del solucionador z3 de Python en MacOS.

Soy un traductor de español que traduce documentos de TI. Traduzca lo siguiente al español. No traduzca el código y la salida en markdown.

Soy nuevo en z3. Estoy intentando ejecutar los siguientes ejemplos de Python con z3.

from z3 import *
x = Real(& # 39; x & # 39;)
y = Real(& # 39; y & # 39;)
s = Solver()
s.add(And(x + y > 1, x == 0.00001, y == 0.1))
print(s.check())

El resultado devuelto es “sat”, que creo que es incorrecto ya que x + y = 0.10001 <1. También imprimo el solucionador s

[And(x + y> 1, x == 1/0, y == 1/10)]

que noté tiene el término x == 1/0 con un 0 en el denominador. Estoy usando Python 3.9.8, z3-solver 4.8.12.0 ejecutándose en macOS 10.14.6 Mojave.

También probé exactamente el mismo ejemplo en una máquina con Ubuntu 20.04, python3.8 y z3-solver 4.8.10.0. El resultado devuelto es “unsat” y no hay 0 en los denominadores cuando se imprime el solucionador.

¿Alguien sabe si estoy haciendo algo mal aquí? Muchas gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema se debe a una diferencia de precisión entre las dos versiones de z3-solver. En la versión de macOS, el solucionador está representando “0.00001” como “1/0”, lo que está causando el resultado inesperado.

    Para evitar este problema, puede usar la clase Rational en z3 para representar números decimales como fracciones con una precisión definida:

    from z3 import *
    
    x = Real('x')
    y = Real('y')
    s = Solver()
    s.add(And(x+y > 1, x == Rational(1, 100000), y == Rational(1, 10)))
    print(s.check())
    

    Esto debería darle el resultado esperado de unsat.

Comments are closed.