我正在尝试从Model计算的Solver中获取Real值。但是,即使我将pp.decimal设置为true(在SMT2文件中和使用Global.setParameter),只有在打印模型本身时才会遵循。
当我尝试使用model.getConstInterp在model.getConstDecls的值上获取值时,它们都显示分数(使我的hacky解决方案使用Double.parseDouble不可行)。
我想知道是否有任何方便的方法来获取模型中常量函数的值而不强迫我编写解析器(对于模型或它产生的算术表达式)。
任何帮助将非常感激。
编辑包含示例:
BoolExpr[] assertions = ctx.parseSMTLIB2String(smt, null, null, null, null);
// get solver from context (modelled upon assertions)
Solver solver = ctx.mkSolver();
solver.add(assertions);
switch (solver.check()) {
case SATISFIABLE: {
// fetch our model
Model model = solver.getModel();
System.out.println(model);
for(FuncDecl constant : model.getConstDecls()) {
// get the interpretation
Expr value = model.getConstInterp(constant);
System.out.println(value.toString());
输出:
(define-fun b () Real
(- 1.0))
(define-fun w2 () Real
0.5)
(define-fun w1 () Real
0.5)
-1
1/2
1/2
我想以某种方式将这些常量函数的结果提取到Java doubles中。如果他们都遵守Expr,我可以简单地解析toString()s'pp.decimal的值。