繁体   English   中英

Z3Opt C ++ API:从文件解析smtlib2公式

[英]Z3Opt C++ API: parse smtlib2 formula from file

在Z3Opt C ++ API中有什么方法可以解析smtlib2文件吗? 所以,基本上我要做的就是将Z3Opt公式转储到文件中,然后在其他程序中读取它。 我发现解析smtlib2文件的唯一函数是Z3_parse_smtlib2_file 但它不支持扩展的smtlib2格式(具有maximize, minimizeassert-soft操作),他们在z3opt教程中描述了这种格式 但是,z3控制台版本接受该格式并没有失败。 这意味着有一些方法可以做我需要的。 那么,请有人帮助我。

这是一个解释我在说什么的例子:

#include <iostream>
#include <fstream>
#include <z3/z3++.h>

void dumpFormula() {
    z3::context ctx;
    auto&& opt = z3::optimize(ctx);

    auto&& x = ctx.int_const("x");
    auto&& y = ctx.int_const("y");

    opt.add(x < 2);
    opt.add((y - x) < 1);
    opt.maximize(x + y);

    std::ofstream out("output.smt2");
    out << opt << std::endl;
    return;
}

void readDumpedFormula() {
    z3::context ctx;
    auto&& opt = z3::optimize(ctx);
    z3::set_param("timeout", 1000);


    Z3_ast a = Z3_parse_smtlib2_file(ctx, "output.smt2", 0, 0, 0, 0, 0, 0);
    z3::expr e(ctx, a);
    opt.add(e);

    auto&& res = opt.check();
    switch (res) {
        case z3::sat: std::cout << "Sat" << std::endl;break;
        case z3::unsat: std::cout << "Unsat" << std::endl;break;
        case z3::unknown: std::cout << "Unknown" << std::endl;break;
    }
    return;
}

int main() {
    dumpFormula();
    readDumpedFormula();
    return 0;
}

函数dumpFormula()创建一个z3opt公式并将其转储到该文件中。 这是'output.smt2'文件:

(declare-fun x () Int)
(declare-fun y () Int)
(assert (< x 2))
(assert (< (- y x) 1))
(maximize (+ x y))
(check-sat)

函数readDumpedFormula()尝试解析该文件并检查该公式。 但我得到的只是错误。 这是该程序的输出:

不支持

; 最大化线:5位:17

星期六

这是一个有点反复出现的问题。 通过API公开的解析器只允许您加载公式。 它使用插件模型让解析器知道哪些命令已注册。 在API中公开的版本中,提供的命令不包括用于优化的命令。

看起来你真的要求一个带有优化对象的功能(对称地,一个求解器对象),并使用字符串或文件中的断言和目标来填充它。

您可以分别对文件加载进行近似,分别声明特殊谓词最大化,最小化,软断言。 然后使用这些断言解析文件。 然后对解析后的断言进行后处理,并将它们提供给优化对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM