gpt4 book ai didi

Z3 量词支持

转载 作者:行者123 更新时间:2023-12-04 03:24:01 24 4
gpt4 key购买 nike

我需要一个定理证明器来解决一些简单的线性算术问题。但是,即使是简单的问题,我也无法让 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 ):

(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足够了。

这是一个更复杂的例子,我们确实需要在其中组合 qesmt (在线试用: 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)

编辑
下面是使用 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";
}

关于Z3 量词支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13199219/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com