c++ - Z3 C++ API : set parameter for tactic

标签 c++ parameters z3

我正在使用 SMT 求解器的 Z3 C++ API,我想更改“ctx-solver-simplify”的参数。我不知道如何将它们输入到策略中。我试过了:

z3::context c; 
c.set("arith_lhs",false);
c.set("eq2ineq",true);

z3::params params(c);
params.set("arith_lhs",true);
params.set("eq2ineq",true);

示例代码:

z3::expr x = c.int_const("x");
z3::expr cond1 = !(x==4);

z3::goal g(c);
g.add(cond1);

z3::tactic t(c, "ctx-solver-simplify");
z3::apply_result r = t(g);

结果是

(goal (not (= x 4)))

不是

(goal and  (< x 4) (> x 4)

同样适用于 arith_lhs。有什么帮助吗? 谢谢!

最佳答案

变化: z3::tactic t(c, "ctx-solver-simplify"); z3::tactic t = with(z3::tactic(c, "simplify"), params);

这将指示 Z3 对所选参数应用简化策略。在 SMT-LIB API 中,这是通过“using-params”组合器完成的。我从 Z3 源代码附带的 example.cpp 获得了上面的 C++ 等价物。

因此存在两个问题:(1) 您需要告诉 Z3 使用选定的参数应用给定的策略。 (2) ctx-solver-simplify 策略没有 eq2ineq 选项。不过,其他策略也可以,包括简化

关于c++ - Z3 C++ API : set parameter for tactic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38511917/

相关文章:

c++ - 在使用有效的 C++ 时赋值吗?

c++ - 在 PPC 中创建线程时崩溃

c++ - 在不调用应用程序/主机 Exe 源代码的情况下调试 Visual C++ DLL

c++ - 对由排序数组组成的合并数组进行排序

function - 无法在函数的Where-Object 中使用变量

z3 - Z3 Python 中无法满足的核心

z3 - 使用 Z3 的配置 API

javascript - 为什么使用匿名函数而不是函数引用作为参数被认为是更好的做法?

c++ - 传递参数为 `const` 的奇怪效果

z3 - Z3 是否支持 Real-to-Int 转换?