假设我使用 API 阅读了 SMTLIB 公式:
context ctx;
...
expr F = to_expr(ctx, Z3_parse_smtlib2_file(ctx,argv[1],0,0,0,0,0,0));
该表达式F
是以下形式的断言的合取:
(and (< (+ x y) 3)
(> (- x1 x2) 0)
(< (- x1 x2) 4)
(not (= (- x1 x2) 1))
(not (= (- x1 x2) 2))
(not (= (- x1 x2) 3)))
我想使用帖子中的以下代码片段从这个连词中提取每个单独的断言:如何使用未饱和核心的 z3 拆分子句并尝试再次找出未饱和核心
F = F.simplify();
for (unsigned i = 0; i < F.num_args(); i++) {
expr Ai = F.arg(i);
// ... Do something with Ai, just printing in this example.
std::cout << Ai << "\n";
}
使用后F.arg(i)
,原来的从句(< (+ x y) 3)
变成了(not (<= 3 (+ x y)))
。这是我的
a) 问题:我怎样才能把子句(not (<= 3 (+ x y)))
放在(< (+ x y) 3)
?
b) 问题:在这种情况下,我认为符号的<=
意思是暗示,而不是小于。我对吗?
c)问题:由于子句(not (<= 3 (+ x y)))
模型是真还是假,我怎样才能得到算术值,例如x = 1, y = -1
?
非常感谢任何建议。非常感谢。