SMT 2.0 格式或 Z3不支持 SMT 2.0 脚本中的参数公理。一种替代方法是使用编程 API。len
您可以创建为给定排序创建公理的函数。这是一个关于如何使用 Python API 进行操作的示例。
http://rise4fun.com/Z3Py/vNa
from z3 import *
def MkList(sort):
List = Datatype('List')
List.declare('insert', ('head', sort), ('tail', List))
List.declare('nil')
return List.create()
def MkLen(sort):
List = MkList(sort)
Len = Function('len', List, IntSort())
x = Const('x', List)
Ax = ForAll(x, If(x == List.nil, Len(x) == 0, Len(x) == 1 + Len(List.tail(x))))
return (Len, [Ax])
IntList = MkList(IntSort())
IntLen, IntLenAxioms = MkLen(IntSort())
print IntLenAxioms
s = Solver()
l1 = Const('l1', IntList)
s.add(IntLenAxioms)
s.add(IntLen(l1) == 0)
s.add(l1 == IntList.insert(10, IntList.nil))
print s.check()