2016-07-21 8 views
1

私はSMTソルバーのZ3 C++ APIを使用していますので、 "ctx-solver-simplify"のパラメータを変更したいと思います。私は戦術にそれらを入力する方法を知らない。私が試した:Z3 C++ API:タクトのパラメータを設定します

z3::context c; 
c.set("arith_lhs",false); 
c.set("eq2ineq",true); 

そして

z3::params params(c); 
params.set("arith_lhs",true); 
params.set("eq2ineq",true); 

を例コード:

z3::expr x = c.int_const("x"); 
z3::expr cond1 = !(x==4); 

z3::goal g(c); 
g.add(cond1); 

z3::tactic t(c, "ctx-solver-simplify"); 
z3::apply_result r = t(g); 

結果が

(goal (not (= x 4))) 

そしてない

です
(goal and (< x 4) (> x 4) 

同じことがarith_lhsに適用されます。どんな助け? ありがとう!

+0

「どのように機能しないのですか?たとえば、あなたが得たアウトプットとあなたが望むアウトプット。 – hyde

+0

エンジニアは、文脈を提供する必要があること、つまり、問題の暗黙の詳細を他の人と共有する必要があることをまず究明する必要があります。問題やそれを取り巻く文脈に精通していない可能性があります。したがって、この場合、(A)z3とは何か、(B)あなたの入力は何か、(C)あなたの期待される出力は何か、(D)実際の出力は何かを説明する必要があります。 – iksemyonov

+0

エンジニアとして、私はできるだけ簡単な質問をしています。私はあなたがZ3-smtソルバーを使用していないと思いますか?とにかく、質問を更新しました。 – toebs

答えて

2

変更: z3::tactic t(c, "ctx-solver-simplify"); z3::tactic t = with(z3::tactic(c, "simplify"), params);

この には、選択したパラメータでsimplify戦術を適用するためにZ3を指示します。 SMT-LIB APIでは、これは "using-params"コンビネータで実現されます。私はZ3ソースに同梱されているexample.cppから上記のC++の同等物を手に入れました。

したがって、2つの問題がありました。(1)選択されたパラメータで指定の戦術を適用するようにZ3に指示する必要があります。 (2)ctx-solver-simplify戦術にはeq2ineqオプションがありません。しかし、simplifyを含む他の戦術があります。

+1

誰かがctx-solver-simplifyでeq2inqを使用したい場合は、まずctx-solver-simplify以降でsimplifyを使用してください。効率的ではありませんが、機能します。 – toebs

+0

良いアイデア、toebs。 –

関連する問題