Сначала посмотрите соответствующий код пользователя для запуска z3-solver. Это работает нормально, и решатель возвращает некоторые значения после вычисления выражения:
# see source at https://github.com/Z3Prover/z3
# the relevant code is at: z3-master/src/api/python/z3/z3.py
# pip install z3-solver
from z3 import *
x = Int('x')
#print(type(x)) # <class 'z3.z3.ArithRef'>
y = Int('y')
s = Solver()
# print(type(s)) # <class 'z3.z3.Solver'>
s.add(x > 10) # this works
s.add(y == x + 2)
print(s)
print(s.check())
print(s.model())
Теперь моя короткая попытка написать оценщик, такой как z3:
class Int():
def __init__(self,name):
self.name = name
self.value = None
def do_print(self):
print('Rand({})'.format(self.name))
def __str__(self):
return(str(self.value))
class Solver():
def add(self, *argv):
self.args = []
for arg in argv:
self.args.append(arg)
def do_print(self):
print('Constr(',end='')
for arg in self.args:
print(arg)
print(')')
x = Int('x')
s=Solver()
s.add(x > 10) # this does not work - but why is same kind of code in z3 working?
# err: TypeError: '<' not supported between instances of 'Int' and 'int'
x.do_print()
s.do_print()
Я получаю ошибку в строке s.add (). Я понимаю ошибку, что объект «х» нельзя сравнить с целым числом. Это происходит потому, что выражение в этой строке вычисляется перед вызовом s.add ().
Но мой вопрос - как z3-solver обходит эту ошибку? Как он может передать аргументы add () без его предварительной оценки?
Как исправить проблему в моем коде и передать выражение в s.add () без его предварительной оценки?