2

私が書いている研究ツールの一部として Z3 Python インターフェイスを使用しています。同じクエリで Z3 ソルバーを繰り返し実行すると、かなり奇妙な動作に気付きました。特に、毎回同じ結果が得られないようです。実行する前にソルバーを明示的にリセットしましたが。参考までに、私のコードは次のとおりです。

import z3

with open("query.smt", "r") as smt_reader:
    query_lines = "".join(smt_reader.readlines())
    for i in xrange(3):
        solver = z3.Solver()
        solver.reset()

        queryExpr = z3.parse_smt2_string(query_lines)
        equivalences = queryExpr.children()[:-1]
        for equivalence in equivalences:
            solver.add(equivalence)

        # Obtain the Boolean variables associated with the constraints.
        constraintVars = [equivalence.children()[0] for equivalence
                          in equivalences]
        # Check the satisfiability of the query.
        querySatResult = solver.check(*constraintVars)

        print solver.model().sexpr()
        print solver.statistics()
        print ""

上記のコードは、Z3 ソルバーを 3 回再作成し、同じクエリの充足可能性をチェックします。クエリはここにあります

上記のコード セクションは、私が Z3 Python インターフェースをどのように使用するかを正確に示したものではありませんが、問題は、Z3 ソルバーが同じクエリのコードの異なるポイントで 2 回呼び出されたときに、異なる結果を返すという認識から生じました。これが意図的なものなのか、これを無効にする方法や決定論を保証する方法があるのか​​ どうか疑問に思っていました.

4

1 に答える 1