对相互递归的数据类型族进行商

Quotienting a mutually recursive family of datatypes

是否可以使用 quotient_type 机制与等价关系族对 Isabelle/HOL 中的相互递归数据类型族进行商运算?

如果是这样,是否已经有这方面的好例子了?搜索 Isabelle 文档和描述修改后的 quotient_type 机制的论文并没有多大帮助。

命令quotient_type一次只能处理一种类型。如果你想对几种相互类型做商,你必须手动编码和解码,但这很简单。

假设你的两个类型是t1t2,等价关系是r1 :: t1 => t1 => boolr2 :: 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,您也可以使用提升包注册q1q2。然后,您将获得用于提升证明和定义的良好自动化。您只需为定义做两个提升步骤(首先从 t1 + t2q,然后从 qq1q2)和两个取消步骤样张。