Z3能否处理包含由declare sort/define sort引入的排序的数据类型?
我试图定义一个数据类型,它包含由declare sort或define sort引入的排序。 但以下尝试会导致错误Z3能否处理包含由declare sort/define sort引入的排序的数据类型?,z3,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))))
(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'
有办法吗
提前谢谢。是的,可以。顺便说一句,看起来你使用的是旧版本的Z3。 你应该试试最新的版本。 Z3.x支持参数化类型。因此,声明数据类型的语法发生了一些变化。 现在,你必须写:
(declare-datatypes () ((listA (nilA) (consA (hdA A) (tlA listA)))))
在新语法中,可以指定类型参数。由于listA不是参数化的,所以您只提供了类型参数的空列表()
。
有关Z3中数据类型的更多信息,请参阅
使用参数化类型,还可以将listA
和listB
编码为:
(declare-datatypes (T) ((list (nil) (cons (hd T) (tl list)))))
(define-sort listA () (list A))
(define-sort listB () (list B))
非常感谢你!在上一篇文章中,我将Z3.2与*.smtc文件一起使用。现在我用新语法尝试了*.smt2文件,效果很好。