We run into performance issues with what, in my opinion, is part of Z3, which considers non-linear arithmetic. Here is a simple concrete example of Boogie, which when testing with Z3 (version 4.1) takes a lot of time (about 3 minutes).
const D: int;
function f(n: int) returns (int) { n * D }
procedure test() returns ()
{
var a, b, c: int;
var M: [int]int;
var t: int;
assume 0 < a && 1000 * a < f(1);
assume 0 < c && 1000 * c < f(1);
assume f(100) * b == a * c;
assert M[t] > 0;
}
It seems that the problem is caused by the interaction of functions, the tolerance of the range from integer variables, as well as the multiplication of (unknown) integer values. The statement at the end does not have to be provable. Instead of working quickly, it seems that the Z3 has ways to somehow create a lot of terms, as its memory consumption grows pretty quickly to about 300 MB, after which it refuses.
, , , Z3 , .
,
function {:inline} f(n: int) returns (int) { n * D }
.
: , Chalice. Boogie , . .
?