Python Z3Py中的量词错误

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

我想检查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 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