Я хотел бы знать, можно ли ограничить диапазон значений универсальной количественной переменной в Z3.
Например, предположим, что у меня есть переменная типа Real с именем time, которая используется для моделирования времени в системе. Допустим, у меня есть утверждение, в котором говорится, что значение некоторой унарной функции func1 всегда должно быть между 1 и 100. Функция принимает на вход переменную времени. Выраженное в Z3, я закодировал свойство следующим образом:
ForAll(time, And(func1(time) >= 1, func1(time) <= 100))
Обратите внимание, что мне явно нужно, чтобы переменная времени была универсально определена количественно, потому что я хочу, чтобы Z3 выдал мне unsat, если я добавлю свойство следующего типа:
Exists(time, func1(time) == 101)
Насколько я понимаю, для Z3 все константы имеют математическую (теоретическую), а не компьютерную (практическую) реализацию, т.е. их значения не связаны (к сожалению, я не могу указать ресурс, где я это читал в данный момент). Предположим, что со временем я моделирую время в своих системах, и в соответствии с системными ограничениями оно не может работать более x часов, что я могу использовать и сказать, что значение времени находится между 0 и x * 60' * 60, чтобы получить максимум время выполнения в секундах. Я знаю, что могу утверждать допустимые значения времени с помощью следующего утверждения:
And(time >= 0, time <= x*60*60)
но повлияет ли это на универсальную количественную оценку, приведенную в 1?
Следовательно, это должно привести к ситуации, когда если вводится свойство 2 и для значения времени я указываю x*60*60 + 1
, его не следует сбрасывать, поскольку ForAll
действует только для значений времени.