假设使用几个内置的和用户定义的 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)))))
这样的包装可以从给定的一组自动创建,但我更喜欢可能的通用解决方案。