簡體   English   中英

Z3Py中的量詞錯誤

[英]Error with quantifier in 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 must be integers or slices, not ArithRef

碼:

from z3 import *
import random
from random import randrange
class Struct:
def __init__(self, **entries): self.__dict__.update(entries)

user = [Struct() for i in range(10)]
for i in range(10):
    user[i].uid = i
    user[i].rights = random.choice(["create","execute","read"]) 

s=Solver()

f1 = Function('f1', IntSort(), BoolSort())
t = Int('t')
f2 = Exists(t, f1(t))
g = ForAll(t, f1(t) == And(t>=0, t<10, user[t].rights == ["read"] ))
s.add(g)
s.add(f2)
print(s.check())
print(s.model())

您正在混合和匹配Python和Z3表達式,盡管這是Z3py的重點,但這絕對並不意味着您可以隨意混合/匹配它們。 通常,您應該將所有“具體”部分保留在Python中,並將符號部分移交給“ z3”; 仔細協調兩者之間的互動。 在您的特定情況下,您正在訪問帶符號z3整數( t )的Python列表(您的user ),這當然是不允許的。 您必須使用Z3符號Array來訪問符號索引。

另一個問題是字符串的使用( "create" / "read"等),並期望它們在符號世界中具有含義。 這也不是打算使用z3py的方式。 如果希望它們在符號世界中具有某種意義,則必須顯式地對其建模。

我強烈建議您閱讀http://ericpony.github.io/z3py-tutorial/guide-examples.htm ,這是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

請注意,如何使用符號域中的枚舉類型Right來對您的“權限”進行建模。

當我多次運行該程序時,我得到:

$ python a.py
5
$ python a.py
9
$ python a.py
unsat
$ python a.py
6

請注意,如果發生“隨機”初始化並沒有使任何用戶具有read權限的情況,則會產生unsat

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM