我希望找到使用z3py给出动作和后置条件的最弱前提条件。
鉴于行动N = N + 1
和帖子条件N == 5
,最弱的前提条件是N == 4.
使用战术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的新手,无法弄清楚采用什么方法或如何实现它。
答案 0 :(得分:4)
是的,solve-eqs
可用于消除平等。问题是我们无法控制哪些平等将被消除。另一种选择是使用qe
(量词消除)。该示例也可用here。
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(Exists([N2], And(N2 == N + 1, N2 == 5)))
t = Tactic('qe')
wp = t(weakestPreconditionGoal)
print(wp)
另一个选择是使用solve-eqs
,但我们不想消除“守卫”等式。
我们可以使用辅助谓词guard
来保护方程。以下是一个示例(也可在线获取here)。当然,我们必须执行第二次传递以从结果中消除guard
。
N2 = Int('N2') # N after the action
N = Int('N') # N before the action
guard = Function('guard', BoolSort(), BoolSort())
weakestPreconditionGoal = Goal()
# 'N2 == n + 1' action
# 'N2 == 5' post condition.
weakestPreconditionGoal.add(N2 == N + 1, guard(N2 == 5))
t = Tactic('solve-eqs')
wp = t(weakestPreconditionGoal)
print(wp)