【问题标题】:getting unknown result with a trivial forall用微不足道的方法得到未知的结果
【发布时间】:2013-04-12 05:06:15
【问题描述】:

我正在使用 z3 C++ API。如果我创建这个简单的错误表达式:

z3::expr x = C->int_const("x");
z3::expr p = z3::forall(x, x==0);

并尝试解决,我得到一个未知的结果。我不是战略和战术专家,但如果我使用正确的战术,我相信 z3 可以解决这个问题。

我也试过

z3::expr p = !z3::forall(x, x==0);

当然,结果相同。

【问题讨论】:

标签: c++ z3


【解决方案1】:

我不熟悉 z3,但从一般 C++ 的角度来看,x==0 不会先评估,你的调用不等于 implies(x, 1) 吗?从快速搜索看来,您可能必须将语句的每一部分构造为 z3 对象,例如:

Z3_ast consequent = Z3_mk_eq(ctx, x, 0);
Z3_ast theorem = Z3_mk_implies(ctx, x, consequent);

但上面的说法也不正确。我相信参数 x0 本身必须是 Z3_ast 的实例,它们封装了您的意思的语句(而不是它们的插值或引用)。

【讨论】:

  • 这不是真的,它是一个有效的 z3 结构。如果我将 forall 替换为存在,它会解决为真,正如人们所期望的那样。也许你很困惑,因为我写得不好,对不起。我现在更新了。
  • 嗯,很可能我确实弄错了。但是你是说 z3 重载了 C++ 的 == 运算符,然后从 x==0 中生成一个语句,而不是对其求值?
  • 没错,C++ api 就是这样做的 ;) 它几乎覆盖了所有内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多