我有两个公式F1和F2。这两个公式共享大多数变量,除了一些具有不同名称的“临时”(或我称之为“自由”)变量,这些变量存在。
现在我要证明F1 == F2,但Z3的prove()方法总是考虑所有变量。我如何告诉prove()忽略那些“免费”变量,并只关注我真正关心的变量列表?
我的意思是对我的变量列表输入所有相同的输入,如果在输出时,F1和F2具有所有这些变量的相同值(无论“自由”变量的值),那么我认为它们是'等价'
我相信此问题在之前的其他研究中已经解决,但我不知道在哪里寻找信息。
非常感谢。
答案 0 :(得分:3)
我们可以使用存在量词来捕获'临时'/'自由'变量。
例如,在以下示例中,公式F
和G
不等效。
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]
。
如果我们将y
和w
视为“临时”变量,我们可能会尝试证明:
prove(Exists([y], F) == Exists([w], G))
现在,Z3将返回proved
。 Z3基本上表明,对于所有x
和z
,有一个y
使F
为真,当且仅当有w
使{ {1}}是的。
Here就是一个完整的例子。
备注:当我们添加量词时,我们使Z3的问题变得更加困难。对于包含量词的问题,它可能会返回G
。
答案 1 :(得分:2)
显然,我无法评论,所以我必须添加另一个答案。 “忽视”某些变量的过程通常称为“投影”或“遗忘”。我在超越命题逻辑的语境中并不熟悉它,但如果直接存在量化是可能的(Leo描述),那么它在概念上是最简单的方法。