簡體   English   中英

Z3在C ++中最大化

[英]Z3 Maximize in C++

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

附錄:鑒於最近的一些答案和討論,我現在要求的不是正常的功能。 所以,我改變了這個問題,要求提供一種方法的具體細節,以便使這項工作成為現實。

謝謝你指出這個問題。 優化功能不是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擴展的簡短教程。

Z3中的優化功能在“opt”分支中處於重構中,並且未與不穩定或主分支集成。 很可能並非所有功能都已添加到API中。 另見Nikolaj對這些問題的回答:

在Z3中編碼“最多k /至少-k布爾是真的”約束

Simple3 in z3 via for all

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM