了解 z3 中的量词

Understanding quantifiers in z3

我正在尝试理解这个例子:

solve([y == x + 1, ForAll([y], Implies(y <= 0, x < y))])

但是看了explanation还是没看懂

你怎么读这个? []是什么意思?

我对此的错误理解是。 “给定定理 y == x + 1。它是否适用于所有 y 使得 Implies(y <= 0, x < y)?” 通过这种解释,如果我使用 y = 0x = -1 每个约束(暗示(y <= 0,x < y)是真的,因为 y <= 0 和 x < y)被尊重,但是如果我 运行这个我发现是不可解的

你对如何理解这个话题有什么看法吗?

[] 是一个 Python 列表;外面的是约束列表(代表连词),ForAll 中的是要绑定的常量列表。

请注意,可以重复使用相同的常量名称。在这种情况下,y == x + 1 中的 y 是全局存在的,ForAll 中的 y 是通用绑定变量,其名称也为 y

看起来这里有一些混淆。让我们首先理清绑定:在量词上下文中,变量是独立的,即它可以在不改变语义的情况下重命名。所以,你原来的:

from z3 import *
x, y = Ints('x y')
solve([y == x + 1, ForAll([y], Implies(y <= 0, x < y))])

完全等同于:

from z3 import *
x, y, z = Ints('x y z')
solve([y == x + 1, ForAll([z], Implies(z <= 0, x < z))])

请注意,我们将 ForAll 的“范围”中的 y 替换为 z,但保留了第一个连词中的那个。只能在ForAll(或Exist)范围内重命名,不能超出

并且这两个等价表达式都是不可满足的。为什么?第一个连词很容易满足;只需选择一个任意 x,然后将 y 设置为 x+1 即可。这是第二个不可满足的合取。因为,不管你选择哪个x满足第一个,你总能找到一个小于那个xz(就选min(0, x-1)),量化公式对于该分配变为 False。因此没有解决方案。

现在,让我们考虑一下您在评论中的变体 x > z:

from z3 import *
x, y, z = Ints('x y z')
solve([y == x + 1, ForAll([z], Implies(z <= 0, x > z))])

同样,第一个连词很容易满足。而这一次,第二次也是,因为你可以选择一个正数 x,只要 z <= 0,它就会大于所有 z,因此其含义总是真的。这正是 z3 告诉你的,当它给你令人满意的分配时:

[x = 2, y = 3]

请注意,此赋值中 没有任何内容 关于变量 z。您无法真正为普遍量化的公式提供模型;根据定义,对于 z.

的所有值都是 true

希望这能解决问题。