Z3在C ++中最大化

时间:2014-07-04 04:30:12

标签: c++ c z3

在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”。

我不介意手动构建表达式 - 而不是使用构造文件。我根本不知道哪个expr函数或运算符用于“maximize”。

附录: 鉴于最近的一些答案和讨论,我现在要求的内容似乎不是正常的功能。所以,我改变了这个问题,要求提供一种方法的具体细节,以便使这项工作成为现实。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

Z3中的优化功能在`opt&#39;分支并且不与不稳定或主分支集成。很可能并非所有功能都已添加到API中。另见Nikolaj对这些问题的回答:

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

Simplex in z3 via for-all