我正在编写一个通用函数,使用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上的所有属性,但似乎没有任何有助于在数组声明上创建正确的条件。
我该如何解决这个问题?我也会错过任何其他类型的声明吗?
答案 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)