了解 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 = 0
和 x = -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
满足第一个,你总能找到一个小于那个x
的z
(就选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
希望这能解决问题。
我正在尝试理解这个例子:
solve([y == x + 1, ForAll([y], Implies(y <= 0, x < y))])
但是看了explanation还是没看懂
你怎么读这个? []是什么意思?
我对此的错误理解是。
“给定定理 y == x + 1。它是否适用于所有 y 使得 Implies(y <= 0, x < y)?”
通过这种解释,如果我使用 y = 0
和 x = -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
满足第一个,你总能找到一个小于那个x
的z
(就选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
.
希望这能解决问题。