Z3:使用量词建模

Z3:使用量词建模,z3,theorem-proving,Z3,Theorem Proving,我想证明(∀i(0≤i0)∧a[k]>0)→∀i(0≤我≤K→a[i]>0)z3。它的否定是:∀i(0≤i0)∧a[k]>0∧∃i(0≤我≤K∧(a[i]>0))。首先,我将k的值设置为5并忽略部分a[k]>0,然后尝试: from z3 import * i = Int('i')` a = Array('a',IntSort(),IntSort()) solver = Solver() solver.add(ForAll(i, Implies(And(i >= 0,i < 5),a

我想证明
(∀i(0≤i0)∧a[k]>0)→∀i(0≤我≤K→a[i]>0)
z3。它的否定是:
∀i(0≤i0)∧a[k]>0∧∃i(0≤我≤K∧(a[i]>0))
。首先,我将k的值设置为5并忽略部分
a[k]>0
,然后尝试:

from z3 import *
i = Int('i')`
a = Array('a',IntSort(),IntSort())
solver = Solver()
solver.add(ForAll(i, Implies(And(i >= 0,i < 5),a[i] > 0)))
solver.add(Exists(i, And(i >= 0,i <= 5, Not(a[i] > 0))))
print solver.check()
print solver.model()
我不知道输出的含义,我认为它的模型应该是
I=5
。然后,我添加了
a[5]>0
,我认为这应该是不满意的。代码如下:

from z3 import *
i = Int('i')
a = Array('a',IntSort(),IntSort())
solver = Solver()
solver.add(ForAll(i, Implies(And(i >= 0,i < 5),a[i] > 0)))
solver.add(Exists(i, And(i >= 0,i <= 5, Not(a[i] > 0))))
solver.add(a[5] > 0)
print solver.check()
print solver.model()

那么,我如何证明
(∀i(0≤i0)∧a[k]>0)→∀i(0≤我≤K→a[i]>0)
由z3py编写,输出的含义是什么?

我不太清楚您试图对查询执行什么操作。为什么要“设置”k的值?根据问题的开头,这似乎与你试图证明的一般情况不符,但也许特例是你现在感兴趣的全部

您已正确地将有效性问题转化为可满足性问题:如果原始公式有效,则公式的否定是可满足的

在Z3的第一个响应中,您确实得到了一个模型;这表明了你试图证明的(较弱的)第一个暗示的反例。如果您考虑这个反例的演示需要什么,您必须选择将(绑定的)存在变量实例化为5。这就是我的意思!模型中0;它是一个新的(自由)名称,表示存在绑定变量被分配到的模型元素

从另一个角度来看(更准确地说,关于工具的作用),在Z3进行有趣的工作之前,存在量词被“skolemised”掉了(存在界变量被替换为一个新常量),因此它实际上处理的查询相当于查询公式的可满足性:

∀i(0≤i<k→a[i]>0)∧a[k]>0∧(0≤ i!0 ≤k∧¬(a[ i!0 ]>0))
∀i(0≤i0)∧a[k]>0∧(0≤ 我!0≤K∧([i!0]>0))
当您将查询强化回对原始含义的否定时,您将从Z3获得unsat。这意味着这个被否定的公式是不可满足的,所以你感兴趣的含义是有效的;你已经证明了 ∀i(0≤i0)∧a[5]>0)→∀i(0≤我≤5.→a[i]>0)

如果您在问题中跳过将k设置为5,您应该会得到相同的结果

关于Z3的第一个响应中的其他信息,模型必须不仅包含(skolemised)i的值,而且还包含问题中的数组a的值。数组被表示为函数,函数可以通过这样一个模型中的案例来定义;“else”的情况是包罗万象的,也是这里使用的每个函数中唯一的情况。Var(0)是函数(第一个也是唯一一个)参数的语法。在这个模型中,数组是通过另外两个函数k!的组合间接定义的!9(似乎用于确定与模型相关的部分指数集;在本例中为0、4和5)和k!8.10(定义了这些索引到值的映射)。特别是,在这个模型中,数组在索引0处存储7720个,在索引4处存储1个,在索引5处存储-38个(在k!9的定义中没有生成其他索引;从概念上讲,我理解这意味着这个模型中的数组在其他索引处是未定义的)

unsat
∀i(0≤i<k→a[i]>0)∧a[k]>0∧(0≤ i!0 ≤k∧¬(a[ i!0 ]>0))