在玩Z3Py时,我已经定义了一个整数列表如下:
List = Datatype('List')
List.declare('cons', ('head', IntSort()), ('tail', List))
List.declare('nil')
List = List.create()
现在,我在该列表上定义了一些简单的函数,如下所示:
len = Function('len', List, IntSort())
def len_defn():
ls = List('ls')
return And([
len(List.nil) == 0,
ForAll(ls, Implies(List.is_cons(ls), len(ls) == 1+len(List.tail(ls))))
])
不幸的是,这最终会失败,因为ls = List('ls')
会抛出错误:
AttributeError: DatatypeSortRef instance has no __call__ method
尝试使用ls = Var(0, List)
投掷:
AttributeError: DatatypeRef instance has no attribute '__len__'
有没有人有任何想法,一般应该如何处理数据类型的量化?
答案 0 :(得分:2)
要创建排序List
的常量,我们应该使用Const
过程。
ls = Const('ls', List)
在Z3Py中,过程ForAll
和Exists
基于以Z3常量作为参数的C API。大多数用户发现这些C API比基于de Bruijn索引的C API更容易使用。
另一个问题,我们不应该重新定义len
。 len
是一个Python内置函数。
为避免程序出现问题,我们应该使用
Len = Function('len', List, IntSort())
以下是重写的示例(also available online here)
List = Datatype('List')
List.declare('cons', ('head', IntSort()), ('tail', List))
List.declare('nil')
List = List.create()
Len = Function('len', List, IntSort())
def len_defn():
ls = Const('ls', List)
return And([
Len(List.nil) == 0,
ForAll(ls, Implies(List.is_cons(ls), Len(ls) == 1+Len(List.tail(ls))))
])
print len_defn()