非线性算法的Z3性能

非线性算法的Z3性能,z3,Z3,我认为Z3中处理非线性算法的部分会遇到性能问题。下面是一个简单具体的Boogie示例,当使用Z3(版本4.1)进行验证时,需要很长时间(大约3分钟)才能完成 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 &&

我认为Z3中处理非线性算法的部分会遇到性能问题。下面是一个简单具体的Boogie示例,当使用Z3(版本4.1)进行验证时,需要很长时间(大约3分钟)才能完成

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;
}
使验证很快终止

背景:这是我们在验证器杯中看到的问题的最小测试用例。在那里,Boogie项目变得更长,可能有类似的多种假设。通常,验证似乎根本没有终止


有什么想法吗?

是的,不终止是由于非线性整数运算。Z3有一个新的非线性解算器,但它用于“非线性实数算术”,并且只能用于仅使用算术的无量词问题(即,没有像您的示例中那样的未解释的函数)。
因此,在您的示例中使用了旧的算术解算器。此解算器对整数算术的支持非常有限。你对问题的分析是正确的。Z3很难找到非线性整数约束块的解决方案。请注意,如果我们将
f(100)*b==a*c
替换为
f(100)*b,您可以包含/发布Z3文件吗?当然可以。我使用Boogie的/proverLog选项来获取Z3输入和。谢谢,这很有帮助,我将尝试使用此选项。最终,我们希望利用Z3中的真正支持,这似乎也解决了我们的问题。但这需要布吉首先支持雷亚尔。
function {:inline} f(n: int) returns (int) { n * D }