[英]How I can to check if a Const is containing in a List in Z3Py?
在 Z3Py 中,我需要检查列表中是否包含 Const 类型,我定义了数据类型列表和 Const,我尝试使用方法 Contain ( https://z3prover.github.io/api/html/namespacez3py. html#ada058544efbae7608acaef3233aa4422 ) 但它只适用于字符串数据类型,我需要所有。
def funList(sort):
List = Datatype('List')
#insert: (Int, List) -> List
List.declare('insert', ('head', sort), ('tail', List))
List.declare('nil')
return List.create()
IntList = funList(IntSort())
l1 = Const('l1', IntList)
我试图在 Z3 中做一个循环,但它不起作用:S
你的问题不是很清楚。 您是否正在尝试编写某种列表成员资格? (就像在列表中查找元素一样。)
如果这是您的目标,我建议不要使用基于Datatype
的编码。 因为您将在其上编写的任何函数(如elem
、 length
等)都必须是递归的。 SMT 求解器不能很好地处理这种形式的递归定义; 因为它将逻辑放入不可判定的片段中。 此外,当出现这些递归类型时,调试和编码相当困难,因为工具支持不是那么好。
如果您的目标是使用类似列表的结构,我建议您改用内置的sequence
逻辑。 下面是一个例子:
from z3 import *
s = Solver()
# declare a sequence of integers
iseq = Const('iseq', SeqSort(IntSort()))
# assert 3 is somewhere in this sequence
s.add(Contains(iseq, Unit(IntVal(3))))
# assert the sequence has at least 5 elements
s.add(Length(iseq) >= 5)
# get a model and print it:
if s.check() == sat:
print s.model()
当我运行这个时,我得到:
$ python a.py
[iseq = Concat(Unit(9),
Concat(Unit(10),
Concat(Unit(3),
Concat(Unit(16), Unit(17)))))]
这可能有点难以阅读,但它本质上是在说iseq
是一个序列,它是一堆单例 ( Unit
) 的串联 ( Concat
)。 在更方便的符号中,这将是:
iseq = [9, 10, 3, 16, 17]
正如您所看到的,它有 5 个元素,其中3
确实是我们的约束所要求的这个序列。
Z3的时序逻辑非常丰富,包含了很多你想要执行的功能。 见这里:https ://z3prover.github.io/api/html/z3py_8py_source.html#l09944
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.