Z3Py: Почему следующие предположения не выполняются?

Это может быть наивным вопросом, но почему следующее не приводит к удовлетворительному набору предположений?

Разве последнее предположение не следует непосредственно из предположений 2 и 3?

import z3

# Initialize variables
t = z3.Int('t')
z = z3.Real("z")
y = z3.Real("y")
M = z3.Real("M")
x = z3.Function("x", z3.IntSort(), z3.RealSort())
f = z3.Function("f", z3.RealSort(), z3.RealSort())
d_f1 = z3.Function("d_f1", z3.RealSort(), z3.RealSort())

# Add assumptions
s = z3.Solver()

s.add(f(y) == f(z) + d_f1(z) *(y-z))
s.add(d_f1(z) < M)
s.add(f(x(t+1)) == f(x(t)) + d_f1(x(t)) *(x(t+1)-x(t)))

s.add(f(x(t+1)) < f(x(t)) + M *(x(t+1)-x(t)))

# Check if assumptions are satisfiable
s.check()

Результат, который я получаю,

unknown

Есть ли способ закодировать аналогичный набор предположений, которые определяются решателем как выполнимые?

Спасибо!


person Curious    schedule 30.03.2016    source источник


Ответы (1)


Z3 возвращает «неизвестно», что означает, что он не может найти модель для утверждений. Предыстория заключается в том, что ваши ограничения используют нелинейную арифметику над свободными функциями (и целыми числами). Z3 не предлагает процедуры принятия решения для фрагмента, в котором находится ваша формула. Вместо этого он пробует неполную процедуру поиска и приходит к состоянию, в котором он не может ни установить, ни опровергнуть утверждения.

person Nikolaj Bjorner    schedule 30.03.2016
comment
Спасибо! это имеет смысл! Вы случайно не знаете рабочую альтернативу этому? возможно, тот, который использует линейную арифметику и при этом сохраняет большинство свойств предположений? Спасибо еще раз - person Curious; 31.03.2016