Да, это возможно. Кстати, кажется, вы используете старую версию Z3.
Вы должны попробовать последнюю версию.
Z3 3.x поддерживает параметрические типы. Итак, синтаксис объявления типов данных немного изменился.
Теперь вы должны написать:
(declare-datatypes () ((listA (nilA) (consA (hdA A) (tlA listA)))))
В новом синтаксисе вы можете указать параметры типа. Поскольку listA не является параметрическим, вы просто предоставили пустой список ()
параметров типа.
Для получения дополнительной информации о типах данных в Z3 см. Руководство Z3 .
Используя параметрические типы, вы также можете кодировать listA
и listB
как:
(declare-datatypes (T) ((list (nil) (cons (hd T) (tl list)))))
(define-sort listA () (list A))
(define-sort listB () (list B))