Java Z3将FuncInterp获取为Null
我正在使用Z3JavaAPI解析SMT文件;当我调用Java Z3将FuncInterp获取为Null,java,z3,smt,Java,Z3,Smt,我正在使用Z3JavaAPI解析SMT文件;当我调用s.getModel(),其中s是一个解算器时,我能够按如下方式正确打印模型: (define-fun O_STUDENT () (Array Int STUDENT_TupleType) ((as const (Array Int STUDENT_TupleType)) (STUDENT_TupleType _ID__12345 _NAME__Bourikas _DEPT_uNAME__Music 29))) (define-fun
s.getModel()
,其中s
是一个解算器时,我能够按如下方式正确打印模型:
(define-fun O_STUDENT () (Array Int STUDENT_TupleType)
((as const (Array Int STUDENT_TupleType))
(STUDENT_TupleType _ID__12345 _NAME__Bourikas _DEPT_uNAME__Music 29)))
(define-fun O_DEPARTMENT () (Array Int DEPARTMENT_TupleType)
((as const (Array Int DEPARTMENT_TupleType))
(DEPARTMENT_TupleType _DEPT_uNAME__Music _BUILDING__BUILDING_u5 50000.0)))
但是,当我试图为O_STUDENT
数组获取FuncInterp
时,我得到了一个null
。我使用以下方法提取该值:
if (s.check() == Status.SATISFIABLE) {
Model m = s.getModel();
FuncDecl arrayDep = m.getConstDecls()[0];
System.out.println(m.getFuncInterp(arrayDep));
}
以防万一:数组有点特殊,因为有常量,但它们的模型是函数(参见示例)
模型可能不包含所有变量的赋值-如果缺少一个,则意味着您可以自由选择任何您喜欢的值。如果您不喜欢,可以启用模型完成,Z3将为您选择。但是在这种情况下,当我打印模型时,我会得到两个数组的解释;但是,我没有使用
m.getFuncInterp
得到一个。你能试试m.getconcenter
?其中至少有一个应该给你一些东西,否则请在使用m.getconcentrep
givescom.microsoft.z3.z3时提交一个bug异常:非零算术函数和数组将函数解释作为一个模型。使用getFuncInterp
。我在GitHub上提出了一个关于此的问题;在你这方面可以复制吗?谢谢,这个bug已经在GitHub上修复了。