Z3 量词支持

2024-01-07

我需要一个定理证明器来解决一些简单的线性算术问题。然而,即使是简单的问题我也无法让 Z3 工作。我知道它不完整,但是它应该能够处理这个简单的示例:

(assert (forall ((t Int)) (= t 5)))
(check-sat)

我不确定我是否忽略了某些事情,但这应该是微不足道的反驳。我什至尝试了这个更简单的例子:

(assert (forall ((t Bool)) (= t true)))
(check-sat)

这应该可以通过进行详尽的搜索来解决,因为 boot 仅包含两个值。

在这两种情况下,z3 都回答未知。我想知道我在这里是否做错了什么,或者如果没有,您是否可以为这些类型的公式推荐一个定理证明者。


为了处理这种量词,您应该使用 Z3 中提供的量词消除模块。这是有关如何使用它的示例(在线尝试http://rise4fun.com/Z3/3C3 http://rise4fun.com/Z3/3C3):

(assert (forall ((t Int)) (= t 5)))
(check-sat-using (then qe smt))

(reset)

(assert (forall ((t Bool)) (= t true)))
(check-sat-using (then qe smt))

命令check-sat-using允许我们指定解决问题的策略。在上面的例子中,我只是使用qe(量词消除),然后调用通用 SMT 求解器。 请注意,对于这些示例,qe足够了。

这是一个更复杂的例子,我们确实需要结合qe and smt(在线尝试:http://rise4fun.com/Z3/l3Rl http://rise4fun.com/Z3/l3Rl )

(declare-const a Int)
(declare-const b Int)
(assert (forall ((t Int)) (=> (<= t a) (< t b))))
(check-sat-using (then qe smt))
(get-model)

EDIT以下是使用 C/C++ API 的相同示例:

void tactic_qe() {
    std::cout << "tactic example using quantifier elimination\n";
    context c;

    // Create a solver using "qe" and "smt" tactics
    solver s = 
        (tactic(c, "qe") &
         tactic(c, "smt")).mk_solver();

    expr a = c.int_const("a");
    expr b = c.int_const("b");
    expr x = c.int_const("x");
    expr f = implies(x <= a, x < b);

    // We have to use the C API directly for creating quantified formulas.
    Z3_app vars[] = {(Z3_app) x};
    expr qf = to_expr(c, Z3_mk_forall_const(c, 0, 1, vars,
                                            0, 0, // no pattern
                                            f));
    std::cout << qf << "\n";

    s.add(qf);
    std::cout << s.check() << "\n";
    std::cout << s.get_model() << "\n";
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Z3 量词支持 的相关文章

  • 如何以 smt2 格式示例获取 z3 求解器的多个解决方案?

    如何使用 smt2 格式的 z3 求解器生成位向量公式的多个模型 在为位向量实现 IDEA 代码时 它正在生成一个模型 如果存在 如何生成相同的所有可能模型 ex smt2 file set logic QF BV set info smt
  • 表示 SMT-LIB 中的时间约束

    我试图在 SMT LIB 中表示时间约束 以检查它们的可满足性 我正在寻找有关我所采取的方向的反馈 我对 SMT LIB 比较陌生 非常感谢您的意见 我所面临的限制是事件的时间和持续时间 例如 考虑以自然语言给出的以下约束 约翰在 13 0
  • Z3 Java API 文档

    我已经安装了Z3 API for Java我正在尝试使用它 但找不到任何解释如何使用此 API 的文档 到目前为止我找到的唯一资源是源代码和示例程序 所以我想知道是否有人知道任何其他文档Z3 Java API 目前 Java API 没有单
  • z3 实数的存在主义理论

    Z3决定非线性实数运算的存在片段吗 也就是说 我可以用它作为决策程序来测试是否 带有 和 x 的无量词公式有实数解吗 是的 Z3有一个非线性多项式实数运算的存在片段的判定过程 当然 该过程是以可用资源为模完成的 该过程相当昂贵 本文 htt
  • 在 Z3-Python 中,执行模型搜索时出现“builtin_function_or_method' object is not iterable”

    我正在探索在 Z3 Python 中执行 SAT 求解的快速方法 为此 我尝试模仿第 5 1 章的结果https theory stanford edu nikolaj programmingz3 html sec blocking eva
  • SMT 中的混合理论

    我想构造一个 SMT 公式 其中包含对整数线性算术和布尔变量的多个断言 以及对实际非线性算术和布尔变量的一些断言 对整数和实数的断言仅共享布尔变量 例如 请考虑以下公式 declare fun b Bool assert b true de
  • 关于 Z3 for Java 的性能问题

    我在当前使用 Z3 for Java 的项目中遇到了一些性能问题 基本上我当前的大多数限制都非常简单 例如 f x 2 f y lt 3 f x lt 5 我正在使用整个项目共享的静态上下文和解算器实例 public class Const
  • 避免 Z3 中的量词

    我正在尝试 Z3 其中结合了算术 量词和等式的理论 这似乎不是很有效 事实上 在可能的情况下用所有实例化的基础实例替换量词似乎更有效 考虑以下示例 其中我对函数的唯一名称公理进行了编码f需要两个参数Obj并返回解释的排序S 该公理指出 每个
  • 使用布尔运算符在 Z3 中定义约束

    比方说 我想使用 Z3 约束将字符串的每个字符限制为字符集 a zA Z0 9 我可以使用布尔运算符来指定吗 举个例子 input BitVec input s i 8 for i in range 10 for i in range 10
  • Z3 返回型号不可用

    如果可能的话 我想要对我的代码有第二意见 问题的约束条件是 a b c d e f是非零整数 s1 a b c and s2 d e f 是集合 The sum s1 i s2 j for i j 0 2必须是一个完美的正方形 我不明白为什
  • 简化 CNF 公式,同时保留某些变量的所有解决方案

    有关的 CNF 简化 https stackoverflow com questions 23461191 cnf simplification 事实上 我认为这个问题的提交者可能是在追求我想要的东西 有许多工具可用于简化 或求解前 预处理
  • Z3Py 中最大值的模型不正确

    我想找到一个表达式的最大间隔e对于所有 x 都成立 编写这样的公式的方法应该是 Exists d ForAll x in d d e and ForAll x not in d d e 为了得到这样一个d 公式f在 Z3 中 看上面的 可能
  • 在 SMTLIB v2 输入中使用 :pattern 不断获得“未知”结果

    我在 Z3 中使用 SMTLIBv2 输入格式和模式时遇到问题 通过以下输入 我不断得到 未知 结果 declare datatypes L L0 L1 declare fun path List L declare fun checkTr
  • 有人尝试过用Z3本身来证明Z3吗?

    有没有人尝试证明Z3 http research microsoft com en us um redmond projects z3 与Z3本身 是否有可能使用 Z3 来证明 Z3 是正确的 更理论化的是 是否有可能使用 X 本身来证明工
  • 如何将公式转换为析取范式?

    说给定一个公式 t1 gt 2 或 t2 gt 3 且 t3 gt 1 我希望得到它的析取范式 t1 gt 2 且 t3 gt 1 或 t2 gt 3 且 t3 gt 1 在Z3中如何实现这一点 Z3没有将公式转换为DNF的API或策略 然
  • Z3 支持非线性算术

    我知道 Z3 对非线性算术有一些支持 但想知道扩展到什么范围 是否可以指定支持和不支持 或可能超时 哪些类别的非线性算术 提前了解这些将帮助我尽早放弃我的任务 似乎不支持与电源相关的内容 如下所示 def pow2 x k Int k re
  • Z3 求解器中 MAxSMT 和用户定义成本函数的组合

    我正在使用 Z3 来优化带有一些软约束 带有加权 MaxSMT 的成本函数 我很好奇 MaxSMT 和用户定义的成本函数如何交互 求解器是否最小化 MaxSMT 成本和目标函数两者 是否有优先级机制 我找不到这方面的任何文档 如果我遗漏了什
  • (Z3Py) 声明函数

    我想在简单的 result x t c 公式中找到一些给定结果 x 对的 c 和 t 系数 from z3 import x Int x c Int c t Int t s Solver f Function f IntSort IntSo
  • Z3 Java API 定义函数

    我需要您帮助使用 Z3 Java API 定义函数 我尝试解决这样的问题 与 z3 exe 进程一起工作正常 declare fun a Real declare fun b Real declare fun c Bool define f
  • 通过 C/C++ API 对 Z3 中的 LIA 进行量词消除

    我想使用 Z3 通过 C C API 消除线性整数算术公式中的量词 考虑一个简单的例子 Exists x x 0 我尝试这样做 context ctx ctx set ELIM QUANTIFIERS true expr x ctx int

随机推荐