我正在使用Java API。这是此警告的最小工作示例:
HashMap<String, String> cfg = new HashMap<String, String>();
cfg.put("model", "true");
Context ctx = new Context(cfg);
Solver solver = ctx.mkSolver();
BoolExpr a = ctx.mkBoolConst("a");
BoolExpr b = ctx.mkBoolConst("b");
BoolExpr and = ctx.mkAnd(a,b);
solver.check(and);
对于这个小程序,Z3抱怨说:
警告:假设必须是命题变量或 否定一个
除非我误解了某些内容,and
是一个命题变量,所以我不明白为什么会出现这个警告。此外,check
方法采用BoolExpr
数组作为参数,为什么它需要一个命题变量?
我的问题:我可以安全地忽略此警告吗?
答案 0 :(得分:1)
不,and
不是命题变量,但它是命题术语(或者换句话说是BoolExpr)。 solver.check(...)
的假设文字需要是变量或变量的否定,即a
或not a
,而不是a and b
。
这个警告不容忽视,因为这意味着Z3会忽略这些假设,即你可能会得到意想不到的结果。
为了避免混淆:solver.check(...)
的参数是假设文字,它们不是断言,即,如果我们想检查是否{{1我们需要首先断言它然后让求解器在没有进一步假设的情况下进行检查,例如,
and