【问题标题】:Z3/SMT: When should I prefer push/pop to reset?Z3/SMT:什么时候我应该更喜欢推/弹出来重置?
【发布时间】:2013-01-11 23:47:11
【问题描述】:

我正在使用 Z3 解决由符号执行器产生的路径条件,它以深度优先顺序探索状态空间,与 CUTE、DART 或(可能)SAGE 非常相似。我们正在尝试使用 Z3 的不同方式。在一个极端情况下,我们将每个查询都发送到 Z3 并在之后立即(重置)它。另一方面,我们(推)每一个额外的分支约束,并(弹出)(弹出)回溯正确削弱路径条件所需的最小值。问题是,在所有情况下,似乎没有一种策略比其他任何策略都更有效。推送似乎提供了最大的优势,但我们遇到了一些情况,每次查询后重置 Z3 比推送/弹出快一个数量级以上。请注意,通信开销可以忽略不计:几乎所有时间都花在 check-sat 中。

有没有人有任何经验可以分享,或者关于 Z3 内部保存的状态的一些指示(引理等),这可以帮助澄清它的行为?那么其他 SMT 求解器的行为呢?

【问题讨论】:

    标签: z3 smt


    【解决方案1】:

    下一个版本 (v4.3.2) 将公开一个可能对您有用的功能。在 Z3 中,默认求解器结合了非增量求解器和增量求解器。当使用push/pop(或使用多个checks而不调用reset)时,Z3将使用增量求解器。在下一个版本中,我们可以为增量求解器提供超时。如果增量求解器在给定的超时时间内不能解决问题,Z3 会自动切换到非增量求解器。也许,如果您使用此功能,您将能够获得“两全其美”的优势。要获取下一个候选版本的源代码,您应该使用

    git clone https://git01.codeplex.com/z3 -b rc
    

    为了编译它,我们使用

    cd z3
    python scripts/mk_make.py
    cd build
    make
    

    要设置增量求解器的超时时间,我们必须提供以下命令行选项:

     combined_solver.solver2_timeout=<time in milliseconds>
    

    如果您使用的是编程 API,则可以使用新 API:

    Z3_global_param_set(Z3_string param_id, Z3_string param_value)
    

    请注意,下一个版本将有一个用于设置参数的新框架。它允许用户为内部 Z3 模块设置参数。

    【讨论】:

    • 感谢您的回答,对于迟到的反馈深表歉意。这仅部分回答了我的问题,因为它没有提供在给定查询序列的情况下建立使用求解器的最佳方法的基本原理,这在我们的案例中可能很关键。顺便问一下,push + reset(不弹出)会触发增量求解器吗?
    猜你喜欢
    • 2018-02-09
    • 2022-01-08
    • 2011-05-10
    • 2016-05-20
    • 2017-12-21
    • 2012-07-05
    • 2020-07-19
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多