Предполагая использование нескольких встроенных и определяемых пользователем сортировок Z3, например. Int, Bool, S1, S2, ..., есть ли способ написать общую функцию сортировки и распаковки, которая выполняет преобразование из сортировки A в сортировку B и обратно? Например
(declare-const a S1)
(declare-const b S2)
(declare-const c Int)
(WRAP[S1] b) ; Expression is of sort S1
(WRAP[S1] c) ; Expression is of sort S1
(WRAP[Int] (WRAP[S1] c)) ; Expression is of sort Int
В настоящее время я рассматриваю каждый случай вручную, например.
(declare-fun $boolToInt (Bool) Int)
(declare-fun $intToBool (Int) Bool)
(assert (forall ((x Int))
(= x ($boolToInt($intToBool x)))))
(assert (forall ((x Bool))
(= x ($intToBool($boolToInt x)))))
Такие оболочки могут быть созданы автоматически из заданного набора сортов, но я бы предпочел универсальное решение из возможных.