Z3发现的模型中集合的java值
我有一个类似于这里的问题:How to print a Z3 Set object? 从中我不知道如何在模型中打印集合的值。我有一个枚举排序(Java代码):
- EnumSort rSort=ctx。mkEnumSort(ctx.mkSymbol(“res”),ctx。mkSymbol(“res1”)李>
我从中创建了一个集合排序:
- SetSort rSet=ctx。mkSetSort(rSort)
通过使用这个集合排序,我创建了一个Z3常量rID,并定义了一个简单的成员表达式:
- BoolExpr c1=(BoolExpr)ctx。mkSetMembership(rSort.getConsts()[0],rID)李>
当c1是可满足的时,我希望看到模型中rID的一个可能值。如果我尝试使用常量解释(例如,m.GetContinterp(e),其中e是模型中的FuncDecl),我会得到:“非零算术函数和数组的函数解释是一个模型。使用FuncInterp。”
当我尝试func解释(即m.getFuncInterp(e))时,我得到“参数不是数组常量”。我做错什么了吗?难道不能打印set object的值吗?或者,有没有更好的方法来表示可能包含排序中多个值的变量
# 1 楼答案
集合在内部由数组表示,数组又具有作为模型的功能。GetContinterp失败,因为
rID
是集合类型(内部数组类型),它会引发相应的异常。从这个例子中不清楚e
是什么,但下面是一个如何获得rID的FuncInterp的例子:请注意,对
getFuncInterp
的调用获取常量rID的FuncDecl,这可能是造成混淆的原因