使用z3py找到最弱的前提条件

时间:2013-06-23 05:24:40

标签: z3 z3py

我希望找到使用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的新手,无法弄清楚采用什么方法或如何实现它。

1 个答案:

答案 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)