0

そこで smtlib2 インスタンスから unsat コアを取得したとき、それらを (not (>=::Int x1)) などの句として分割し、その句を z3 に追加して再度解決しようとしましたが、問題が発生しました遵守後。

警告: 無効な関数の適用、位置 1 の引数の並べ替えの不一致警告: (define not Bool Bool) の適用先: (not (<= 0::Int x6)) of sort Bool

expr F = to_expr(ctx,f);
solver s(ctx);`
expr_vector todo(c);
vector<expr> u;
todo.push_back(F);
while (!todo.empty()) {
    expr current = todo.back();
    todo.pop_back();
    if (current.decl().decl_kind() == Z3_OP_AND) {
         for (unsigned i = 0; i < current.num_args(); i++) {
             u.push_back(current.arg(i));
          }
    }
}
for(i=0;i<u.size();i++){
    expr r = to_expr(ct.,Z3_mk_not(ctx,u[i]));
    s.add(r);
}
if(s.check() == sat){
    model m = s.get_model();
}else if(s.check() == unsat){
    expr_vector core = s.unsat_core();
}

助けていただけませんか?どうもありがとうございました。

4

1 に答える 1

2

完全な例を提供していません。したがって、正確にするのは難しいです。私の推測では、異なるZ3コンテキストからの式を混合していると思います。次のコードは非常に疑わしいものです。

solver s(ctx);
expr_vector todo(c);

2つのZ3コンテキストがあるようです:ctxc。あるコンテキストの式と式を別のコンテキストで使用することはできません。それらをあるコンテキストから別のコンテキストに変換する必要があります(API:) Z3_translate。これは「高度な」機能です。ほとんどのユーザーは、複数のコンテキストを必要としません。単一のコンテキストを使用することを強くお勧めします。

さらに、Stackoverflowで利用可能なさまざまな既存の投稿からコードフラグメントを「グルー」しようとしているようです。ただし、結果のコードは奇妙に見えます。基本的に、数式fを取得し、-loopでその結合を抽出してから、while-loopでそれぞれの否定をアサートしforます。つまりf、式が

A and B and C

プログラムは、ソルバーで次のリテラルをアサートしていますs(Not A)、、。それはあなたが本当に欲しいものですか?(Not B)(Not C)

なぜ2ループを使用するのですか?-loopで否定をアサートしwhile、補助ベクトルを回避できuます。

check別の問題は、仮定を提供せずに呼び出すことです。したがって、unsat_coreメソッドは空のベクトルを返します。examples/c++/example.cppZ3ディストリビューションのファイルにあるunsat-coreの例をご覧ください。

Z3には、Pythonや.Netなどの管理対象言語用のAPIがあることに注意してください。これらはC++よりもはるかに使いやすいです。Z3PythonAPIのチュートリアルがいくつかあります。

于 2012-12-10T17:17:17.063 に答える