【问题标题】:Z3 Maximize in C++Z3 在 C++ 中最大化
【发布时间】:2014-08-25 08:18:36
【问题描述】:

在 Z3 中,以下明确评估为最大值 2,模型 x=true 和 y=true。

(declare-const x Bool)
(declare-const y Bool)
(declare-const z Bool)
(assert(= z false))
(maximize(
  +  
    (ite (= x true) 1 0) 
    (ite (= y true) 1 0) 
    (ite (= z true) 1 0)
  )
)
(check-sat)
(get-model)

如何使用 C/C++ API 来实现这一点?我试过用这个简单地解析:

Z3_ast parsed = Z3_parse_smtlib2_string(c,<The above Z3>,0,0,0,0,0,0);
z3::expr simpleExample(c, parsed);
s.add(simpleExample);

但它会打印“unsupported \n ;maximize”。

我不介意手动构建表达式 - 而不是使用构建的文件。我只是不知道要为“maximize”使用哪些 expr 函数或运算符。

附录: 根据最近的一些答案和讨论,我现在要求的似乎不是正常的功能。所以,我改变了这个问题,询问目前情况的具体细节。

【问题讨论】:

  • 替代方案:MS是否提供Z3的源代码?如果是这样,您可以调试正确解析和评估的第一种方法。
  • 我不确定他们是否这样做。不过我确实知道我的示例适用于他们的网站。
  • 我明白了,但我并没有真正理解你的意思。你到底在暗示什么?
  • 抓住源头。构建、运行和调试您的代码。您可以在令牌解析器使用 maximize 时进行调试,并检查它为什么会在 "unsupported ..." 上阻塞。您将看到失败的情况,您可能会获得一些见解。或者,您可以浏览源代码并检查 maximize 需要什么内部表示以及如何重新格式化您的代码。

标签: c++ c z3


【解决方案1】:

感谢您指出这个问题。优化功能不是 SMT-LIB2 的一部分。它们是自定义扩展。此外,解析 SMT-LIB2 基准的函数没有任何办法 反映优化编译指示。 API解析器无法识别的原因 这些扩展是优化功能未向该解析器注册 (它们在命令行解析器中注册)。当然他们没有注册 “不稳定”分支中的解析器,它们也没有在解析器中注册 在包含优化扩展的“opt”分支中。 根据您的帖子,我几乎想“解决”这个问题,但我现在不确定 为什么它会有用,因为该解析器无法使用这些扩展。 Z3 具有其他未针对 SMT-LIB2 解析器公开的扩展。 所以现在,我倾向于让 API 公开的解析器只接受正确的 SMT-LIB2。

请注意,Christoph 指出优化功能只是“opt”分支的一部分。 欢迎您尝试一下,但它仍然在搅动。 API就我而言 关注“功能完整”(回答(1))。您可以在 Python、Java 和 .NET 中使用它。 OCaml 集成正在等待对 OCaml API 的其他更改。我没有机会为 API 提供任何详尽的文档,但在 http://rise4fun.com/Z3/tutorial/optimization 上有一个关于 SMT-LIB 扩展的简短教程。

【讨论】:

    【解决方案2】:

    Z3 中的优化功能在 `opt' 分支中正在大量构建,并且未与不稳定或 master 分支集成。很有可能尚未将所有功能都添加到 API 中。另请参阅 Nikolaj 对这些问题的回答:

    Encoding “at-most-k / at-least-k booleans are true” constraints in Z3

    Simplex in z3 via for-all

    【讨论】:

    • 非常感谢。几个问题。 1)你说“这很有可能......”有什么方法可以让我们自己更确定这一点吗? 2)我们可以“在家”构建和使用这个“选择”分支吗(顺便说一下,最后一次提交并不是最近的)? 3) 那么有什么方法可以使用任何语言或任何平台(Windows/Linux)来让问题中显示的 Z3 输入在不使用网站的情况下运行?百万丹克
    • 您好,我刚刚下载并尝试了“opti”分支。命令行 Z3 仍然没有选择“最大化”条件。在代码中,我看到了一些看起来很神秘的函数,其名称如“z3_check_opti”。我认为这些与这个问题有关,但我真的太不清楚了,无法利用它。你有什么想法吗?
    • 1) 是的。 2) 是的。 3)是的,但没有方便的。有些事情需要超过一周的时间才能实施。
    • @d'alar'cop 我相信 Nikolaj Bjorner 指的是 opt- 分支,它与 opti- 分支完全不同。 opti- 分支中的最大化暴露了 SYMBA 最大化工具的内部接口,这完全是另外一回事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2021-08-23
    • 2016-12-05
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多