支持在SAT时获取模型(类似于CVC4中的--dump-models)

时间:2015-07-21 23:20:35

标签: z3

我刚刚开始使用Z3解算器,它是开源的。

我目前使用Z3作为命令行黑盒工具,如果模型是SAT,它希望转储反例。我主要通过QF_NIA和QF_LIA查询。我注意到在Z3中不存在等同于CVC4s --dump-models的选项。我可以在SMT2lib文件中写入(check-sat)之后写入(dump-model),但如果公式实际上不满意则会出错。

SMT2 lib的语言虽然看起来很低调,但远不是一种正确解释的交互式语言。例如,像(cond(check-sat)(dump-model))这样的东西应该可以工作。

无论如何,作为Z3源代码的新手,我已经破解了一些东西,并且认为我会与开发团队分享。我已经内联了一个补丁(不知道如何在stackoverflow中附加东西),如果将其整合到主线中,那就太棒了。如果有更好的方法可以做同样的事情,请告诉我。

此外,如果这不是此类讨论的正确论坛,请道歉。请让我知道正确的途径。

我在看似简单的查询上也有一些与Z3性能相关的问题,CVC4能够轻松解决,我将为将来的讨论保留。

谢谢,

的Pankaj

补丁开始:

diff --git a/src/cmd_context/cmd_context.cpp b/src/cmd_context/cmd_context.cpp                                                  
index 7316085..c45f668 100644                                   
--- a/src/cmd_context/cmd_context.cpp                           
+++ b/src/cmd_context/cmd_context.cpp                           
@@ -40,6 +40,8 @@ Notes:                                        
 #include"scoped_timer.h"                                       
 #include"interpolant_cmds.h"                                   

+extern bool g_get_model_when_sat;                              
+                                                               
 func_decls::func_decls(ast_manager & m, func_decl * f):        
     m_decls(TAG(func_decl*, f, 0)) {                           
     m.inc_ref(f);                                              
@@ -1355,8 +1357,15 @@ void cmd_context::check_sat(unsigned num_assumptions, expr * const * assumptions                         
         m_solver->set_status(r);                               
         display_sat_result(r);                                 
         validate_check_sat_result(r);                          
-        if (r == l_true)                                       
+        if (r == l_true) {                                     
             validate_model();                                  
+            if (g_get_model_when_sat) {                        
+                symbol gm("get-model");                        
+                cmd *gm_cmd = find_cmd(gm);                    
+                gm_cmd->prepare(*this);                        
+                gm_cmd->execute(*this);                        
+            }                                                  
+        }                                                      
     }                                                          
     else {                                                     
         // There is no solver installed in the command context.
diff --git a/src/shell/main.cpp b/src/shell/main.cpp            
index 0eb612f..2fbd8ec 100644                                   
--- a/src/shell/main.cpp                                        
+++ b/src/shell/main.cpp                                        
@@ -43,6 +43,7 @@ bool                g_standard_input      = false;                                                            
 input_kind          g_input_kind          = IN_UNSPECIFIED;    
 bool                g_display_statistics  = false;             
 bool                g_display_istatistics = false;             
+bool                g_get_model_when_sat  = false;             

 void error(const char * msg) {                                 
     std::cerr << "Error: " << msg << "\n";                     
@@ -92,6 +93,7 @@ void display_usage() {
     //
     std::cout << "\nOutput:\n";
     std::cout << "  -st         display statistics.\n";
+    std::cout << "  -m          Execute get-model after every check-sat, if model is available\n";
 #if defined(Z3DEBUG) || defined(_TRACE)
     std::cout << "\nDebugging support:\n";
 #endif
@@ -174,6 +176,9 @@ void parse_cmd_line_args(int argc, char ** argv) {
             else if (strcmp(opt_name, "st") == 0) {
                 g_display_statistics = true;
             }
+            else if (strcmp(opt_name, "m") == 0) {
+                g_get_model_when_sat = true;
+            }
             else if (strcmp(opt_name, "ist") == 0) {
                 g_display_istatistics = true;
             }

补丁结束

1 个答案:

答案 0 :(得分:2)

我在不稳定的分支中添加了dump-models选项。提交3d7785c..fc3e1af