z3pyを使用して、アクションと事後条件が与えられたときに最も弱い前提条件を見つけたいです。
アクションN = N + 1
と事後条件を考えるとN == 5
、最も弱い前提条件は N == 4 になります。
Tactic を使用すると、solve-eqs
このアプローチは一部の投稿条件では機能しますが、他の条件では機能しません。投稿条件N < 5
を使用すると、 [[Not(4 <= N)]]
.
しかし、N == 5
私が使用[[]]
するとき、私が望むときN == 4
。
N2 = Int('N2') # N after the action
N = Int('N') # N before the action
weakestPreconditionGoal = Goal()
# 'N2 == n + 1' action
# 'N2 == 5' post condition.
weakestPreconditionGoal.add(N2 == N + 1, N2 == 5)
t = Tactic('solve-eqs')
wp = t(weakestPreconditionGoal)
print(wp)
これは、最も弱い前提条件を見つける最良のアプローチですか?
いくつかの方法を試しましたが、Z3 は初めてで、どのアプローチを採用するか、どのように実装するかがわかりません。