現在、Pythonでz3を使用して、プログラムトレースの実現可能性を確認しています。z3式とアサーションを作成するトレースに基づいて、次のアプローチは現在、Z3_benchmark_to_smtlib_stringを介して中間言語としてSMT2を使用して、これらのアサーションをiZ3とsmtinterpolにフィードしています。
小さな例:x = Int('x')y = Int('y')
s = Solver()
# Assertions
s.assert_and_track(x > y, 'p1')
s.assert_and_track(x == 0, 'p2')
s.assert_and_track(y > 0, 'p3')
a = s.assertions()
v = a[0].as_ast()
f = And(a[1], a[2])
print Z3_benchmark_to_smtlib_string(a[0].ctx_ref(), "name", "QF_LIA", "unsat", "", 1, v, f.as_ast())
これにより、出力が生成されます
; name
(set-info :status unsat)
(set-logic QF_LIA)
(declare-fun y () Int)
(declare-fun x () Int)
(assert
(> x y))
(assert
(let (($x12 (> y 0)))
(let (($x10 (= x 0)))
(and $x10 $x12))))
(check-sat)
これは、いくつかの自主的に変更した後、smtinterpolにフィードするのに適しています。
; name
(set-info :status unsat)
(set-option :produce-proofs true)
(set-logic QF_LIA)
(declare-fun y () Int)
(declare-fun x () Int)
(assert (!
(> x y) :named p1))
(assert (!
(let (($x12 (> y 0)))
(let (($x10 (= x 0)))
(and $x10 $x12))) :named p2))
(check-sat)
(get-interpolants p1 p2)
私たちが望んでいるのは、ハックなしですべてのアサーションをsmt2出力に入れて、ANDを介してすべての1:endアサーションを1つの方程式に結合する可能性です。c-codeドキュメント(capi.html#gaf93844a5964ad8dee609fac3470d86e4"> http://research.microsoft.com/en-us/um/redmond/projects/z3/group_capi.html#gaf93844a5964ad8dee609fac3470d86e4)で推測しようとした場合6番目と7番目のパラメーターですが、アサーションのリストを提供することで機能させることができました。
私は例えば試しました:
print Z3_benchmark_to_smtlib_string(a[0].ctx_ref(), "name", "QF_LIA", "unsat", "", 2, f.as_ast(), v)
しかし、に遭遇します
exception: access violation reading 0x00000004
また、リストを与えるだけでは機能しません。
print Z3_benchmark_to_smtlib_string(a[0].ctx_ref(), "name", "QF_LIA", "unsat", "", 2, [a[0].as_ast(), a[1].as_ast()], a[2].as_ast())
基本的に、誰かが__in_ecount(num_assumptions)Z3_ast constに相当するPythonを知っていますか?または、ソルバーのアサーションのリストからsmt2出力を生成する別の可能性はありますか?