对相互递归的数据类型族进行商
Quotienting a mutually recursive family of datatypes
是否可以使用 quotient_type
机制与等价关系族对 Isabelle/HOL 中的相互递归数据类型族进行商运算?
如果是这样,是否已经有这方面的好例子了?搜索 Isabelle 文档和描述修改后的 quotient_type
机制的论文并没有多大帮助。
命令quotient_type
一次只能处理一种类型。如果你想对几种相互类型做商,你必须手动编码和解码,但这很简单。
假设你的两个类型是t1
和t2
,等价关系是r1 :: t1 => t1 => bool
和r2 :: t2 => t2 => bool
。那么,
quotient_type q = "t1 + t2" / "rel_sum r1 r2"
为合商类型。然后您可以将这两个商定义为投影:
lift_definition Abs1 :: "t1 ⇒ q" is "Inl" .
lift_definition Abs2 :: "t2 ⇒ q" is "Inr" .
typedef q1 = "range Abs1" by blast
typedef q2 = "range Abs2" by blast
使用setup_lifting
,您也可以使用提升包注册q1
和q2
。然后,您将获得用于提升证明和定义的良好自动化。您只需为定义做两个提升步骤(首先从 t1 + t2
到 q
,然后从 q
到 q1
或 q2
)和两个取消步骤样张。
是否可以使用 quotient_type
机制与等价关系族对 Isabelle/HOL 中的相互递归数据类型族进行商运算?
如果是这样,是否已经有这方面的好例子了?搜索 Isabelle 文档和描述修改后的 quotient_type
机制的论文并没有多大帮助。
命令quotient_type
一次只能处理一种类型。如果你想对几种相互类型做商,你必须手动编码和解码,但这很简单。
假设你的两个类型是t1
和t2
,等价关系是r1 :: t1 => t1 => bool
和r2 :: t2 => t2 => bool
。那么,
quotient_type q = "t1 + t2" / "rel_sum r1 r2"
为合商类型。然后您可以将这两个商定义为投影:
lift_definition Abs1 :: "t1 ⇒ q" is "Inl" .
lift_definition Abs2 :: "t2 ⇒ q" is "Inr" .
typedef q1 = "range Abs1" by blast
typedef q2 = "range Abs2" by blast
使用setup_lifting
,您也可以使用提升包注册q1
和q2
。然后,您将获得用于提升证明和定义的良好自动化。您只需为定义做两个提升步骤(首先从 t1 + t2
到 q
,然后从 q
到 q1
或 q2
)和两个取消步骤样张。