Prove()方法,但忽略一些'免费'变量?

时间:2012-12-28 15:33:26

标签: z3

我有两个公式F1和F2。这两个公式共享大多数变量,除了一些具有不同名称的“临时”(或我称之为“自由”)变量,这些变量存在。

现在我要证明F1 == F2,但Z3的prove()方法总是考虑所有变量。我如何告诉prove()忽略那些“免费”变量,并只关注我真正关心的变量列表?

我的意思是对我的变量列表输入所有相同的输入,如果在输出时,F1和F2具有所有这些变量的相同值(无论“自由”变量的值),那么我认为它们是'等价'

我相信此问题在之前的其他研究中已经解决,但我不知道在哪里寻找信息。

非常感谢。

2 个答案:

答案 0 :(得分:3)

我们可以使用存在量词来捕获'临时'/'自由'变量。 例如,在以下示例中,公式FG不等效。

x, y, z, w = Ints('x y z w')
F = And(x >= y, y >= z)
G = And(x > z - 1, w < z)
prove(F == G)

该脚本将生成反例[z = 0, y = -1, x = 0, w = -1]。 如果我们将yw视为“临时”变量,我们可能会尝试证明:

prove(Exists([y], F) == Exists([w], G))

现在,Z3将返回proved。 Z3基本上表明,对于所有xz,有一个y使F为真,当且仅当有w使{ {1}}是的。

Here就是一个完整的例子。

备注:当我们添加量词时,我们使Z3的问题变得更加困难。对于包含量词的问题,它可能会返回G

答案 1 :(得分:2)

显然,我无法评论,所以我必须添加另一个答案。 “忽视”某些变量的过程通常称为“投影”或“遗忘”。我在超越命题逻辑的语境中并不熟悉它,但如果直接存在量化是可能的(Leo描述),那么它在概念上是最简单的方法。