Z3 微小变化但结果不同(所有和存在)

Z3 微小变化但结果不同(所有和存在),z3,z3py,Z3,Z3py,我有一组不等式,我想找到一个(平凡的)解 当我使用Exists操作符时,一切都很好,正如您在本文档及其Z3Py版本中看到的那样 #!/bin/python from z3 import * # we have that s = Solver() ## mu0_px is the initial marking for place px; mu_p1, mu_p2, mu_p3 = 0, 0, 1 ## pi_tj is the pre-condition from place pi to

我有一组不等式,我想找到一个(平凡的)解

当我使用Exists操作符时,一切都很好,正如您在本文档及其Z3Py版本中看到的那样

#!/bin/python

from z3 import *

# we have that
s = Solver()
## mu0_px is the initial marking for place px; 
mu_p1, mu_p2, mu_p3 = 0, 0, 1

## pi_tj is the pre-condition from place pi to transition tj
p1_t1, p1_t2, p1_t3 = 1, 0, 0
p2_t1, p2_t2, p2_t3 = 0, 1, 0
p3_t1, p3_t2, p3_t3 = 0, 0, 1

## tj_pi is the post-condition from transition tj to place pi
t1_p1, t2_p1, t3_p1 = 0, 1, 0
t1_p2, t2_p2, t3_p2 = 1, 0, 0
t1_p3, t2_p3, t3_p3 = 0, 0, 0

## find the values for the faulty transitions 
f_p1, p1_f = Ints('f_p1 p1_f')
f_p2, p2_f = Ints('f_p2 p2_f')
f_p3, p3_f = Ints('f_p3 p3_f')

# where they should be 
s.add( f_p1 == 1, f_p2 == 0, f_p3 == 0 )
s.add( p1_f == 0, p2_f == 0, p3_f == 1 )

## l \in Naturals ; 
l11 = Int('l11')

# Sequence 11: t1,t2,t3
s11_t1, s11_t2, s11_t3 = 1, 1, 0


# It does works! :o
s.add( l11 == 1 )
s.add(
   Exists([l11],
      Or(
         mu_p1 + (t1_p1-p1_t1)*s11_t1 + (t2_p1-p1_t2)*s11_t2 + (t3_p1-p1_t3)*s11_t3 + l11 * (f_p1 - p1_f) < p1_t3,
         mu_p2 + (t1_p2-p2_t1)*s11_t1 + (t2_p2-p2_t2)*s11_t2 + (t3_p2-p2_t3)*s11_t3 + l11 * (f_p2 - p2_f) < p2_t3,
         mu_p3 + (t1_p3-p3_t1)*s11_t1 + (t2_p3-p3_t2)*s11_t2 + (t3_p3-p3_t3)*s11_t3 + l11 * (f_p3 - p3_f) < p3_t3,
      )
   )
)


print(s)
print(s.check())
print(s.model())
#/bin/python
从z3进口*
#我们有
s=解算器()
##mu0_px是位置px的初始标记;
mu_p1,mu_p2,mu_p3=0,0,1
##pi_tj是从位置pi到过渡tj的先决条件
p1_t1,p1_t2,p1_t3=1,0,0
p2_t1,p2_t2,p2_t3=0,1,0
p3_t1,p3_t2,p3_t3=0,0,1
##tj_pi是从转换tj到放置pi的后置条件
t1_p1,t2_p1,t3_p1=0,1,0
t1_p2,t2_p2,t3_p2=1,0,0
t1_p3,t2_p3,t3_p3=0,0,0
##查找故障转换的值
f_p1,p1_f=Ints('f_p1 p1_f')
f_p2,p2_f=int('f_p2 p2_f')
f_p3,p3_f=Ints('f_p3 p3_f')
#他们应该在哪里
s、 加法(f_p1==1,f_p2==0,f_p3==0)
s、 加法(p1_f==0,p2_f==0,p3_f==1)
##l \在自然中;
l11=Int('l11')
#序列11:t1、t2、t3
s11_t1,s11_t2,s11_t3=1,1,0
#它确实有用!:o
s、 加(l11==1)
s、 加(
存在([l11],
或(
mu_p1+(t1_p1-p1_t1)*s11_t1+(t2_p1-p1_t2)*s11_t2+(t3_p1-p1_t3)*s11_t3+l11*(f_p1-p1_f)
然而,当我将存在量词替换为Forall时,就像在下面的Python代码中一样,当我认为它仍然应该是sat时,没有解决方案

#!/bin/python

from z3 import *

# we have that
s = Solver()
## mu0_px is the initial marking for place px; 
mu_p1, mu_p2, mu_p3 = 0, 0, 1

## pi_tj is the pre-condition from place pi to transition tj
p1_t1, p1_t2, p1_t3 = 1, 0, 0
p2_t1, p2_t2, p2_t3 = 0, 1, 0
p3_t1, p3_t2, p3_t3 = 0, 0, 1

## tj_pi is the post-condition from transition tj to place pi
t1_p1, t2_p1, t3_p1 = 0, 1, 0
t1_p2, t2_p2, t3_p2 = 1, 0, 0
t1_p3, t2_p3, t3_p3 = 0, 0, 0

## find the values for the faulty transitions 
f_p1, p1_f = Ints('f_p1 p1_f')
f_p2, p2_f = Ints('f_p2 p2_f')
f_p3, p3_f = Ints('f_p3 p3_f')

# where they should be 
s.add( f_p1 == 1, f_p2 == 0, f_p3 == 0 )
s.add( p1_f == 0, p2_f == 0, p3_f == 1 )

## l \in Naturals ; 
l11 = Int('l11')

# Sequence 11: t1,t2,t3
s11_t1, s11_t2, s11_t3 = 1, 1, 0


# It does not work! :(
s.add( l11 == 1 )
s.add(
   ForAll([l11],
      Or(
         mu_p1 + (t1_p1-p1_t1)*s11_t1 + (t2_p1-p1_t2)*s11_t2 + (t3_p1-p1_t3)*s11_t3 + l11 * (f_p1 - p1_f) < p1_t3,
         mu_p2 + (t1_p2-p2_t1)*s11_t1 + (t2_p2-p2_t2)*s11_t2 + (t3_p2-p2_t3)*s11_t3 + l11 * (f_p2 - p2_f) < p2_t3,
         mu_p3 + (t1_p3-p3_t1)*s11_t1 + (t2_p3-p3_t2)*s11_t2 + (t3_p3-p3_t3)*s11_t3 + l11 * (f_p3 - p3_f) < p3_t3,
      )
   )
)


print(s)
print(s.check())
print(s.model())
#/bin/python
从z3进口*
#我们有
s=解算器()
##mu0_px是位置px的初始标记;
mu_p1,mu_p2,mu_p3=0,0,1
##pi_tj是从位置pi到过渡tj的先决条件
p1_t1,p1_t2,p1_t3=1,0,0
p2_t1,p2_t2,p2_t3=0,1,0
p3_t1,p3_t2,p3_t3=0,0,1
##tj_pi是从转换tj到放置pi的后置条件
t1_p1,t2_p1,t3_p1=0,1,0
t1_p2,t2_p2,t3_p2=1,0,0
t1_p3,t2_p3,t3_p3=0,0,0
##查找故障转换的值
f_p1,p1_f=Ints('f_p1 p1_f')
f_p2,p2_f=int('f_p2 p2_f')
f_p3,p3_f=Ints('f_p3 p3_f')
#他们应该在哪里
s、 加法(f_p1==1,f_p2==0,f_p3==0)
s、 加法(p1_f==0,p2_f==0,p3_f==1)
##l \在自然中;
l11=Int('l11')
#序列11:t1、t2、t3
s11_t1,s11_t2,s11_t3=1,1,0
#它不起作用!:(
s、 加(l11==1)
s、 加(
ForAll([l11],
或(
mu_p1+(t1_p1-p1_t1)*s11_t1+(t2_p1-p1_t2)*s11_t2+(t3_p1-p1_t3)*s11_t3+l11*(f_p1-p1_f)

以前有人遇到过这样的问题吗?

您声明的变量
l11
与量化中使用的变量完全不同:特别是,您声明它等于1与量化公式无关。因此,您得到的
sat
是存在变量,而
unsat
是通用变量该公式显然不适用于
l11
的所有值


这可能会让人困惑,但这是预期的行为。要查看效果,只需打印smtlib等价物,您就会看到变量是如何分配的。

感谢您的回复,@alias,我如何表达一个约束条件,表示我希望所有l11>=1的解决方案
?我更改了下面URL中的代码,但我仍然很满意想知道这是否是在通用量词中表达此类约束的正确方法。只需按照您所说的方式编写(模语法:)
ForAll([l1],暗示(l1>=1,条件))
谢谢@alias的帮助