Z3可以处理包含declare-sort / define-sort引入的排序的数据类型吗?

时间:2011-12-21 16:09:56

标签: z3

我试图定义一个包含declare-sort或define-sort引入的排序的数据类型。 但是以下尝试会导致错误。

(declare-sort A)
(define-sort B () Int)
(declare-datatypes ((listA (nilA) (consA (hdA A) (tlA listA))))) ;=> unknown sort 'A'
(declare-datatypes ((listB (nilB) (consB (hdB B) (tlB listB))))) ;=> unknown sort 'B'

有办法吗?

提前致谢。

1 个答案:

答案 0 :(得分:3)

是的,它可以。顺便说一句,似乎你使用的是旧版Z3。 你应该试试最新版本。 Z3 3.x支持参数类型。因此,声明数据类型的语法稍有改变。 现在,你必须写:

(declare-datatypes () ((listA (nilA) (consA (hdA A) (tlA listA)))))

在新语法中,您可以指定类型参数。由于listA不是参数化的,因此您只提供了类型参数的空列表()。 有关Z3中数据类型的更多信息,请参阅Z3 guide

使用参数类型,您还可以将listAlistB编码为:

(declare-datatypes (T) ((list (nil) (cons (hd T) (tl list))))) 
(define-sort listA () (list A))
(define-sort listB () (list B))