Z3找到的模型中集合的值

时间:2014-04-08 16:02:19

标签: java z3 smt

我对此处的问题提出了类似的问题:How to print a Z3 Set object? 从中我无法计算如何在模型中打印集合的值。我有一个枚举排序(Java中的代码):

  • EnumSort rSort = ctx.mkEnumSort(" res"),ctx.mkSymbol(" res1"));

我从中创建了一个集合类:

  • SetSort rSet = ctx.mkSetSort(rSort)

通过使用此set sort,我创建了一个Z3常量rID并定义了一个简单的成员资格表达式:

  • BoolExpr c1 =(BoolExpr)ctx.mkSetMembership(rSort.getConsts()[0],rID);

当c1可满足时,我希望在模型中看到rID的一个可能值。如果我尝试使用const解释(即m.getConstInterp(e),其中e是来自模型的FuncDecl),我得到:"非零arity函数和数组具有FunctionInterpretations作为模型。使用FuncInterp。"。

当我尝试使用func解释(即m.getFuncInterp(e))时,我得到了#34; Argument不是数组常量"。我在这里做错了吗?是不是可以打印设置对象的值?或者,是否有更好的方法来表示可能包含排序中的多个值的变量?

1 个答案:

答案 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,这可能是混淆的源。