2014-07-02 29 views
1

在下面的代碼中,我放了一個明顯不能令人滿意的Z3聲明,然後嘗試使用C++/C Z3 API以編程方式查看它。Z3_parse_smtlib_string使用問題

問題是這段代碼總是觸發輸出的檢查:「SAT ?!」。即明確不可滿足的表達式被確定爲在API調用的當前使用中是可滿足的。

如何獲得此類操作以按預期方式工作?

#include "z3++.h" 
int main(){ 
    z3::context c; 

    std::string testing = "(declare-const p0 Bool)(assert(= p0 true))(assert(= p0 false))(check-sat)"; 

    Z3_ast parsed = Z3_parse_smtlib2_string(c,testing.c_str(),0,0,0,0,0,0); 
    z3::expr e(c, parsed); 

    z3::solver s(c); 
    if(s.check() == z3::sat) 
    std::cout << "SAT?!\n"; 
    return 0; 
} 

回答

2

Z3在這種情況下是正確的,因爲沒有約束條件被添加到求解器中,因此這是可以滿足的。關鍵部分是這樣的:

Z3_ast parsed = Z3_parse_... 
z3::expr e(c, parsed); 

z3::solver s(c); 
s.add(e); // <--- Add constraints to solver here 
if(s.check() ... 
+0

它的工作!謝謝。請注意該SO的MS研究員:也許你可以看到,這個非常好的定理證明器的文檔和示例需要進行一些改進。 –

+0

對於C++ API,有一個例子顯示了這裏的大部分基本概念:https://z3.codeplex.com/SourceControl/latest#examples/c++/example.cpp API文檔位於:http:// research .microsoft.com/en-us/um/redmond/projects/z3/index.html –

+0

我看到了這些,但是有很多事情是人們通常希望做的事情之一(作爲Z3業餘愛好者)苦心經營。那些足夠聰明的人生出這樣的產品應該會發現它很容易使用它。 –