2015-10-14 1 views
1

Я получаю неожиданные результаты с помощью какого-либо скрипта с использованием 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] 

Может кто-нибудь помочь мне понять, что происходит?

ответ

0

Python if-then-else не переводит в if-then-else Z3. Вы должны использовать функцию «If». См. Здесь: https://github.com/Z3Prover/z3/blob/master/src/api/python/z3.py#L1092

+0

Итак, если я правильно понимаю это, функция g должна быть определена как: 'return If (x == 0, 1, x * (x + 1))'. Это нормально? – EHM

+0

Да. Обратите внимание, что в вашем исходном примере используется '**', и ваша предлагаемая замена имеет только '*', первая из которых является экспоненциальной, а последняя - умножением. Убедитесь, что вы выбрали тот, который вы хотите! (Я не удивлюсь, если Z3 начнет отвечать «неизвестно» при наличии возведения в степень, но это не то, что мы обсуждаем в любом случае.) –

+0

Да! Ты прав. Это была опечатка. Еще раз спасибо! – EHM

0

Моих навыков Python немного недоразвиты, но я думаю, что важна концепция, лежащая в основе этой проблемы заключается в том, что функции Python не переводят на функцию Z3, например, if x == 0: ... не создать функцию Z3, которая проверяет все возможные значения x. Самый простой способ проверить - просто распечатать решатель, чтобы он показывал вам ограничения, просто добавьте print s. В вашем неудовлетворительном случае я получаю [x > 1, x < 1], что действительно неудовлетворительно.

+0

Oh! Понимаю. Это делает вещи более ясными. Спасибо! – EHM