我对此处的问题提出了类似的问题:How to print a Z3 Set object? 从中我无法计算如何在模型中打印集合的值。我有一个枚举排序(Java中的代码):
我从中创建了一个集合类:
通过使用此set sort,我创建了一个Z3常量rID并定义了一个简单的成员资格表达式:
当c1可满足时,我希望在模型中看到rID的一个可能值。如果我尝试使用const解释(即m.getConstInterp(e),其中e是来自模型的FuncDecl),我得到:"非零arity函数和数组具有FunctionInterpretations作为模型。使用FuncInterp。"。
当我尝试使用func解释(即m.getFuncInterp(e))时,我得到了#34; Argument不是数组常量"。我在这里做错了吗?是不是可以打印设置对象的值?或者,是否有更好的方法来表示可能包含排序中的多个值的变量?
答案 0 :(得分:1)
集合在内部由数组表示,而数组又具有模型的功能。 getConstInterp失败,因为rID
是set-type(内部数组类型),它会抛出相应的异常。从示例中不清楚e
是什么,但这里是一个如何获取rID的FuncInterp的示例:
Context ctx = new Context(cfg);
EnumSort rSort = ctx.mkEnumSort(ctx.mkSymbol("res"), ctx.mkSymbol("res1"));
SetSort rSet = ctx.mkSetSort(rSort);
Expr rID = ctx.mkConst("rID", rSet);
BoolExpr c1 = (BoolExpr)ctx.mkSetMembership(rSort.getConsts()[0], rID);
Solver s = ctx.mkSolver();
s.add(c1);
Status status = s.check();
Model m = s.getModel();
System.out.println(status);
System.out.println("Model = " + m);
FuncInterp fi = m.getFuncInterp(rID.getFuncDecl());
System.out.println("fi="+ fi);
请注意,对getFuncInterp
的调用获取常量rID的FuncDecl,这可能是混淆的源。