Types 排序参数包装函数
假设使用多个内置和用户定义的Z3排序,例如Int、Bool、S1、S2等,有没有一种方法可以编写一个通用的排序包装和-展开函数,这种函数可以从排序a转换到排序B,然后再转换回来?比如说Types 排序参数包装函数,types,wrapper,z3,parametric-polymorphism,Types,Wrapper,Z3,Parametric Polymorphism,假设使用多个内置和用户定义的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] (
(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)))))
这样的包装器可以根据给定的一组排序自动创建,但我更喜欢一个可能的通用解决方案。您可以使用数据类型来编码“联合类型”。 以下是一个例子:
(declare-sort S1)
(declare-sort S2)
(declare-datatypes () ((S1-S2-Int (WRAP-S1 (S1-Value S1))
(WRAP-S2 (S2-Value S2))
(WRAP-Int (Int-Value Int)))))
(declare-const a S1)
(declare-const b S2)
(declare-const c Int)
(simplify (WRAP-S1 a))
(simplify (= (WRAP-S1 a) (WRAP-Int 10)))
(simplify (S1-Value (WRAP-S1 a)))
(simplify (is-WRAP-S2 (WRAP-S1 a)))
(simplify (is-WRAP-S1 (WRAP-S1 a)))
(simplify (is-WRAP-Int (WRAP-Int c)))
(simplify (S1-Value (WRAP-S2 b)))
您可以在中找到有关数据类型的更多信息。数据类型S1-S2-Int
有三个构造函数:WRAP-S1
、WRAP-S2
和WRAP-Int
。Z3自动生成识别器谓词:is-WRAP-S1
、is-WRAP-S2
和is-WRAP Int
。访问器S1-Value
、S2-Value
和Int-Value
用于“解构”一个S1-S2-Int
值。例如,对于所有a
,(S1值(WRAP-s1a))=a
。(S1值(WRAP-S2 b))
的值未指定。在这种情况下,Z3将S1值
视为未解释的函数
顺便说一句,公理
(assert (forall ((x Int))
(= x ($boolToInt($intToBool x)))))
等于假。它本质上是试图将整数注入布尔值 谢谢你,利奥!我没有注意到$boolToInt axiom等同于false,但幸运的是它从未被触发。您的解决方案仍然需要为所有相关的排序预先创建一个联合数据类型,但我想这是没有办法的。