c++ - 如何在 z3 c++ 界面中启用校样?

标签 c++ z3

如何通过 Z3 中的 C++ 接口(interface)启用校样?我尝试了以下方法将 :produce-proofs 设置为 true,但如果我取消注释该行,稍后当我尝试将 !conjecture 添加到解决方案时,即使在取消注释调用 proof() 的行之前,我也会崩溃。基于示例 C++ 文件中的函数:

        void prove_example2(std::ostream& os) {
        os << "prove_example2\n";

        context c;
        solver s(c);
        params p(c);
        //p.set(":produce-proofs", true);
        s.set(p);

        expr x = c.int_const("x");
        expr y = c.int_const("y");
        expr z = c.int_const("z");
        sort I = c.int_sort();
        func_decl g = function("g", I, I);

        expr conjecture1 = implies(g(g(x) - g(y)) != g(z) && x + z <= y && y <= x,
            z < 0);


        s.add(!conjecture1);
        os << "conjecture 1:\n" << conjecture1 << "\n";
        if (s.check() == unsat) {
            os << "proved" << "\n";
            // Needs setup before calling
            //os << s.proof() << "\n";
        }
        else
            os << "failed to prove" << "\n";
}

最佳答案

参见 test_capi.c 中的 mk_proof_context .必须在上下文和求解器中启用证明。在 C++ 中,最简单的方法可能是通过

设置全局默认参数
z3::set_param("proof", "true");

在创建任何上下文或求解器之前。

关于c++ - 如何在 z3 c++ 界面中启用校样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42170841/

相关文章:

c++ - rand 的 dlsym() 使用失败

c++ - 读取文件并保存在istream C++中

c++ - 在Qt中测试Lambda唯一连接

types - 如何在 z3 中定义 Int 排序(SMT-LIB 2.0 Ints 理论)和动态声明的排序?

z3 - 模型在通用量化公式中意味着什么?它是一个函数吗?

c++ - 如何按列对 QTableView 进行排序?

c++ - .def 文件等效于 OS X

python - 为字符串约束设置求解器

Z3 python 对待 x**2 与 x*x 不同?

haskell - 浮点 SMT 逻辑比实际逻辑慢吗?