【问题标题】:Understanding quantifiers in z3了解 z3 中的量词
【发布时间】:2021-11-20 12:38:33
【问题描述】:

我试图理解这个例子:

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

但是看了explanation还是没看懂。

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

我对此的错误解释是。 “给定定理 y == x + 1。它是否适用于所有 y 使得 Implies(y y = 0 和 x = -1 每个约束 (Implies(y

你对如何理解这个话题有任何帮助吗?

【问题讨论】:

    标签: python lambda z3 quantifiers


    【解决方案1】:

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

    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。因此没有解决方案。

    现在,让我们考虑一下您的 cmets 中的变体,x &gt; z

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

    同样,第一个合取很容易满足。这一次,第二次也是如此,因为你可以选择一个积极的x,只要z &lt;= 0,这将比所有z 都要大,因此暗示总是正确的。这正是 z3 告诉你的,当它给你一个令人满意的任务时:

    [x = 2, y = 3]
    

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

    希望这能解决问题。

    【讨论】:

    • 只是一些细节。如果我在第一个等式中选择x = -10(带有`x) then with z = -5`的那个陈述应该是正确的吧?所以有一些值满足等式
    • 没有。由于第二个子句是普遍量化的,因此您需要能够选择一个 x 使其适用于所有整数 z。而整件事正是因为你找不到这样的x而无法满足。
    • 这是另一种思考方式:您可以将ForAll 视为无限连词;每个整数值 z 一个。 (即..., -4, -3, -2, -1, 0, 1, 2, 3, ...。想象一下,如果您以这种方式扩展它并结合所有术语,公式会是什么样子。现在,对于solve,您需要满足其中的每一个无限数量的子句。现在您可以看到x &lt; z 变体是unsat,因为没有小于所有负整数的x,但x &gt; zsat,因为任何正数x 都可以, 因为任何积极的x 都将大于所有z &lt;= 0
    • 我认为(希望)我明白了 xD。谢谢,现在我可以理解那个例子了
    【解决方案2】:

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

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

    【讨论】:

    • 我觉得这样写太复杂了,我看不懂。所以你是说 ForAll 中的 y 与 y == x+1 中的 y 不一样?如果是这种情况,那么该陈述应该是正确的吗?关于我如何解释它的 Forall 部分似乎总是正确的。
    • 第一个y和第二个y是独立的。从某种意义上说,你可以读作[y == x + 1, ForAll([z], Implies(z &lt;= 0, x &lt; z))];因此它是错误的,因为你总能找到一个小于zx
    • @alias 谢谢你的回答。我发现所有这些都更令人困惑,因为如果我写 [y == x + 1, ForAll([z], Implies(z &lt;= 0, x &gt; z))] 那么为什么这应该是真的?我总能找到比 z 更重要的 x。还是我错了?
    • 嗯,这就是它不是正确的。上述 cmets 中没有任何内容表明这是真的。
    • 我写个答案解释一下;这些评论框不适合这样长时间的讨论。
    猜你喜欢
    • 1970-01-01
    • 2021-02-03
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2012-10-23
    相关资源
    最近更新 更多