Python Z3Py中的量词错误
我想检查Z3是否存在满足我公式的整数Python Z3Py中的量词错误,python,z3,z3py,Python,Z3,Z3py,我想检查Z3是否存在满足我公式的整数t。我得到以下错误: Traceback (most recent call last): File "D:/z3-4.6.0-x64-win/bin/python/Expl20180725.py", line 18, in <module> g = ForAll(t, f1(t) == And(t>=0, t<10, user[t].rights == ["read"] )) TypeError: list indices
t
。我得到以下错误:
Traceback (most recent call last):
File "D:/z3-4.6.0-x64-win/bin/python/Expl20180725.py", line 18, in <module>
g = ForAll(t, f1(t) == And(t>=0, t<10, user[t].rights == ["read"] ))
TypeError: list indices must be integers or slices, not ArithRef
回溯(最近一次呼叫最后一次):
文件“D:/z3-4.6.0-x64-win/bin/python/Expl20180725.py”,第18行,在
g=ForAll(t,f1(t)=和(t>=0,t=0,t您正在混合和匹配Python和Z3表达式,虽然这是Z3py的全部要点,但它绝对不意味着您可以任意混合/匹配它们。通常,您应该保留Python中的所有“具体”部分,并将符号部分降级为“Z3”;仔细协调两者之间的交互。在您的特定情况下,您使用符号z3整数(t
)访问Python列表(您的用户
),这当然是不允许的。您必须使用z3符号数组
访问符号索引
另一个问题是字符串(“create”
/“read”
等)的使用,并期望它们在符号世界中有意义。z3py也不是这样使用的。如果你想让它们在符号世界中有意义,你必须对它们进行显式建模
我强烈建议大家通读这篇文章,这是对z3py的一个很好的介绍,包括许多高级功能
话虽如此,我倾向于将您的示例编码如下:
from z3 import *
import random
Right, (create, execute, read) = EnumSort('Right', ('create', 'execute', 'read'))
users = Array('Users', IntSort(), Right)
for i in range(10):
users = Store(users, i, random.choice([create, execute, read]))
s = Solver()
t = Int('t')
s.add(t >= 0)
s.add(t < 10)
s.add(users[t] == read)
r = s.check()
if r == sat:
print s.model()[t]
else:
print r
请注意,如果发生“随机”错误,则如何生成unsat
初始化没有让任何用户具有读取权限。您正在混合和匹配Python和Z3表达式,虽然这是Z3py的全部要点,但它绝对不意味着您可以任意混合/匹配它们。一般来说,您应该保留Python中的所有“具体”部分,并将符号部分降级为“Z3”;仔细协调两者之间的交互。在您的特定情况下,您使用符号z3整数(t
)访问Python列表(您的用户
),这当然是不允许的。您必须使用z3符号数组
访问符号索引
另一个问题是字符串(“create”
/“read”
等)的使用,并期望它们在符号世界中有意义。z3py也不是这样使用的。如果你想让它们在符号世界中有意义,你必须对它们进行显式建模
我强烈建议大家通读这篇文章,这是对z3py的一个很好的介绍,包括许多高级功能
话虽如此,我倾向于将您的示例编码如下:
from z3 import *
import random
Right, (create, execute, read) = EnumSort('Right', ('create', 'execute', 'read'))
users = Array('Users', IntSort(), Right)
for i in range(10):
users = Store(users, i, random.choice([create, execute, read]))
s = Solver()
t = Int('t')
s.add(t >= 0)
s.add(t < 10)
s.add(users[t] == read)
r = s.check()
if r == sat:
print s.model()[t]
else:
print r
请注意,如果“随机”初始化没有使任何用户具有读取
权限,则如何生成unsat
。非常感谢您的帮助。对不起,我是Z3Py编程的初学者。非常感谢您的帮助。对不起,我是Z3Py编程的初学者。
$ python a.py
5
$ python a.py
9
$ python a.py
unsat
$ python a.py
6