从模型中获取函数和常量的解释

时间:2013-01-09 21:36:33

标签: c# z3

我正在编写一个通用函数,使用FuncDecl从模型中解释Z3's .NET API

这是一个简化的代码片段:

Model m = s.Model;
foreach (FuncDecl d in m.Decls)
    if (d.DomainSize == 0 && d.Arity == 0)
       Console.WriteLine(d.Name + " -> " + m.ConstInterp(d));
    else 
       Console.WriteLine(d.Name + " -> " + m.FuncInterp(d));

但是,当代码尝试调用ConstInterp时,代码在数组声明时失败。

  

Microsoft.Z3.Z3Exception:非零arity函数和数组具有   FunctionInterpretations作为模型。使用FuncInterp。

我检查了Model上的所有属性,但似乎没有任何有助于在数组声明上创建正确的条件。

我该如何解决这个问题?我也会错过任何其他类型的声明吗?

1 个答案:

答案 0 :(得分:1)

数组常量是Z3中的一个例外,因为它们将函数解释作为模型。这就是ConstInterp不适用的原因,因此抛出异常。我担心现在最好的解决方案就是检查funcdecl的范围,直到我们得到更好的解决方案。

,例如,替换

if (d.DomainSize == 0 && d.Arity == 0)

if (d.DomainSize == 0 && d.Arity == 0 && d.Range.SortKind != Z3_ARRAY_SORT)