使用 Z3 求解器求解长度为任意大小数组的条件
Solve using Z3 solver a condition with a length of an arbitrary size array
我正在学习 Z3 解算器。我对数组和相关条件有疑问。特别是,我必须创建 Z3py 代码来解决以下 if 条件:
totalAccounts = [ 1, 2, 3, 4, 5 ]
def (myAccounts):
cnt = len(myAccounts)
if (cnt > 10) doSomething()
myAccounts
是整数列表,是列表 totalAccounts
的子集。
要通过的条件是 cnt > 10
取决于 length of myAccounts
list.
我想我需要将 myAccounts
表示为 Z3 的数组,并使用函数 Store
.
复制 totalAccounts
中的值
MYACCOUNTS = Array ('MYACCOUNTS', IntSort(), IntSort())
I = Int('I')
i = 0
for elem in totalAccounts:
MYACCOUNTS = Store(MYACCOUNTS, i, elem)
i = i + 1
但我不知道如何在创建添加到求解器的条件中表示此类数组的长度:
solver = Solver()
solver.add( ??? > 10 )
我做的对吗?
SMTLib 数组(以及随后的 z3 和 z3py 数组)按其整个域类型进行索引。在您的示例中,索引类型为 Int()
,因此该数组具有一个任意整数值的元素。请注意,这与编程语言中数组的通常处理方式不同,在编程语言中您通常会得到数组的 "length"。您可以在此处阅读有关 SMTLib 数组的更多信息:http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf(尤其是第 39 页。)
为了对数组长度的任何概念进行建模,人们通常会在单独的符号变量中对其进行跟踪,并且无论何时表达属性,通常都会参考该变量来完成。准确询问您要解决的问题会让您走得更远。
您可能还想查看 Z3 指南(https://rise4fun.com/z3/tutorial/guide), which also has a section on arrays. Stack-overflow also has similar questions regarding array usage in z3py, here's one example answer, relevant to the current context:
我正在学习 Z3 解算器。我对数组和相关条件有疑问。特别是,我必须创建 Z3py 代码来解决以下 if 条件:
totalAccounts = [ 1, 2, 3, 4, 5 ]
def (myAccounts):
cnt = len(myAccounts)
if (cnt > 10) doSomething()
myAccounts
是整数列表,是列表 totalAccounts
的子集。
要通过的条件是 cnt > 10
取决于 length of myAccounts
list.
我想我需要将 myAccounts
表示为 Z3 的数组,并使用函数 Store
.
totalAccounts
中的值
MYACCOUNTS = Array ('MYACCOUNTS', IntSort(), IntSort())
I = Int('I')
i = 0
for elem in totalAccounts:
MYACCOUNTS = Store(MYACCOUNTS, i, elem)
i = i + 1
但我不知道如何在创建添加到求解器的条件中表示此类数组的长度:
solver = Solver()
solver.add( ??? > 10 )
我做的对吗?
SMTLib 数组(以及随后的 z3 和 z3py 数组)按其整个域类型进行索引。在您的示例中,索引类型为 Int()
,因此该数组具有一个任意整数值的元素。请注意,这与编程语言中数组的通常处理方式不同,在编程语言中您通常会得到数组的 "length"。您可以在此处阅读有关 SMTLib 数组的更多信息:http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf(尤其是第 39 页。)
为了对数组长度的任何概念进行建模,人们通常会在单独的符号变量中对其进行跟踪,并且无论何时表达属性,通常都会参考该变量来完成。准确询问您要解决的问题会让您走得更远。
您可能还想查看 Z3 指南(https://rise4fun.com/z3/tutorial/guide), which also has a section on arrays. Stack-overflow also has similar questions regarding array usage in z3py, here's one example answer, relevant to the current context: