我试图定义一个包含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'
有办法吗?
提前致谢。
答案 0 :(得分:3)
是的,它可以。顺便说一句,似乎你使用的是旧版Z3。 你应该试试最新版本。 Z3 3.x支持参数类型。因此,声明数据类型的语法稍有改变。 现在,你必须写:
(declare-datatypes () ((listA (nilA) (consA (hdA A) (tlA listA)))))
在新语法中,您可以指定类型参数。由于listA不是参数化的,因此您只提供了类型参数的空列表()
。
有关Z3中数据类型的更多信息,请参阅Z3 guide。
使用参数类型,您还可以将listA
和listB
编码为:
(declare-datatypes (T) ((list (nil) (cons (hd T) (tl list)))))
(define-sort listA () (list A))
(define-sort listB () (list B))