Я получаю неожиданные результаты с помощью какого-либо скрипта с использованием Python API Z3. Я думаю, что я неправильно понимаю какой-то процесс или просто неправильно использовал какую-то команду. Например, предположим, что у меня есть следующий сценарий:Как правильно использовать команду Solver() в Python API Z3 с объявленной функцией
from z3 import *
x = Int('x')
def g(x):
if x == 0:
return 1
elif x > 0:
return x**(x+1)
s = Solver()
s.add(g(x) > x)
print s.check()
if s.check()== sat:
m = s.model()
m.evaluate(x, model_completion=True)
print m
Это будет возвращать следующий вывод:
sat
[x = 0]
что это нормально, но если я заменить s.add(g(x) > x)
на s.add(x > 1, g(x) > x)
, это возвращает unsat
. Я ожидал чего-то вроде:
sat
[x = 2]
Может кто-нибудь помочь мне понять, что происходит?
Итак, если я правильно понимаю это, функция g должна быть определена как: 'return If (x == 0, 1, x * (x + 1))'. Это нормально? – EHM
Да. Обратите внимание, что в вашем исходном примере используется '**', и ваша предлагаемая замена имеет только '*', первая из которых является экспоненциальной, а последняя - умножением. Убедитесь, что вы выбрали тот, который вы хотите! (Я не удивлюсь, если Z3 начнет отвечать «неизвестно» при наличии возведения в степень, но это не то, что мы обсуждаем в любом случае.) –
Да! Ты прав. Это была опечатка. Еще раз спасибо! – EHM