Z3无法使用存在量词来检测矛盾的陈述

时间:2018-10-08 08:53:14

标签: z3 z3py

我构建了一个矛盾的z3程序。我添加了一些约束,然后添加了带有存在量词(Exists([_x1,_y1,_z1],Implies(And(_CV1+_CE1<=_z1,And(_CE1<=_x1,_x1<_y1)),And(ForAll([_n1],Implies(And(_n1>=_x1,_n1<_y1),_z1+_f(_n1)<a)),_z1+_y1>=a))))的矛盾语句

a=Int('a')
c=Int('c')
b=Int('b')
_n=Int('_n')
_CV1=Int('_CV1')
_CS1=Int('_CS1')
_CE1=Int('_CE1')
_x1=Int('_x1')
_y1=Int('_y1')
_z1=Int('_z1')
_n1=Int('_n1')
_f=Function('_f',IntSort(),IntSort())
_s=Solver()
_s.set("timeout",50000)
_s.add(ForAll([_n],Implies(_n>=0, _f(_n)==_n)))
_s.add(_CS1>=0)
_s.add(_CE1>_CS1)
_s.add(ForAll([_n1],Implies(And(_n1>=_CS1,_n1<_CE1),_CV1+_f(_n1)<a)))
_s.add(_CV1+_CE1>=a)  
_s.add(Exists([_x1,_y1,_z1],Implies(And(_CV1+_CE1<=_z1,And(_CE1<=_x1,_x1<_y1)),And(ForAll([_n1],Implies(And(_n1>=_x1,_n1<_y1),_z1+_f(_n1)<a)),_z1+_y1>=a))))

z3返回以下反例

[_y1!1 = 1,_x1!2 = 5,a = 1,_CS1 = 0,_CE1 = 1,_CV1 = 0,_z1!0 = 0,_f = [0 -> 0, else -> Var(0)]]

语句与存在量词的含义中包含约束_x1<_y1。奇怪的反例_y1!1 = 1,_x1!2 = 5。我不明白为什么它会返回这些值。

如果我删除存在量词,则在查询后构造它会导致矛盾。

_s.add(_CS1>=0)
_s.add(_CE1>_CS1)
_s.add(ForAll([_n1],Implies(And(_n1>=_CS1,_n1<_CE1),_CV1+_f(_n1)<a)))
_s.add(_CV1+_CE1>=a)  
_s.add(_x1>=_CE1)
_s.add(_y1>_x1)
_s.add(_CV1+_CE1<=_z1)
_s.add(ForAll([_n1],Implies(And(_n1>=_x1,_n1<_y1),_z1+_f(_n1)<a)))
_s.add(_z1+_y1>=a)

能帮我理解为什么第一个z3程序返回时未返回所需结果的原因。请指出我是否有任何错误?

0 个答案:

没有答案