2017-02-11 5 views
2

Z3のC++インターフェイスを使って校正を有効にするにはどうすればよいですか?私は次のように設定しようとしました:プロダクトプルーフをtrueにしましたが、そのラインのコメントを外すと、プルーフ()を呼び出すラインのコメントを外す前に、ソリューションに推測を追加しようとするとクラッシュしました。例えば、C++ファイル内の関数に基づいて:z3 C++インターフェイスでプルーフを有効にするにはどうすればよいですか?

 void prove_example2(std::ostream& os) { 
     os << "prove_example2\n"; 

     context c; 
     solver s(c); 
     params p(c); 
     //p.set(":produce-proofs", true); 
     s.set(p); 

     expr x = c.int_const("x"); 
     expr y = c.int_const("y"); 
     expr z = c.int_const("z"); 
     sort I = c.int_sort(); 
     func_decl g = function("g", I, I); 

     expr conjecture1 = implies(g(g(x) - g(y)) != g(z) && x + z <= y && y <= x, 
      z < 0); 


     s.add(!conjecture1); 
     os << "conjecture 1:\n" << conjecture1 << "\n"; 
     if (s.check() == unsat) { 
      os << "proved" << "\n"; 
      // Needs setup before calling 
      //os << s.proof() << "\n"; 
     } 
     else 
      os << "failed to prove" << "\n"; 
} 

答えて

0

test_capi.cmk_proof_contextを参照してください。証明は、ソルバとコンテキストの両方で有効にする必要があります。 C++では、コンテキストやソルバーを作成する前に、

z3::set_param("proof", "true"); 

でグローバルデフォルトパラメータを設定するのが最も簡単な方法です。

+0

このように見えますが、証明を取得した後に証明パラメータを再度オフにすることを忘れないでください。そうしないと、明示的にプルーフを取得していないサブユニットテストがクラッシュします。 – dewtell

+0

(小規模で可読な)テストケースを共有する場合は、これらのクラッシュを確認してください。 –

+0

こんにちは、クリストファー。以前のテスト(demorgan、ここで私は証明書をunsatの場合はダンプしていました)から証明パラメータを残したとき、分布のexample.cppファイルに基づいてクラッシュする単体テストはnonlinear_example1です。私が変換した他のものは、これまでのところbitvector_example2を通してokと思われ、パラメータをオフに戻すとクラッシュが消えます。ですから、これはnonlinear_example1のautoconfigとの特定の競合であると推測しており、そのサンプルファイルで試すことができます。私たちはビルドシステムの下にこれを持っています、あるいは私はオリジナルdistrで自分自身でそれを試してみるでしょう。 – dewtell

関連する問題