引用相互递归的数据类型系列

时间:2016-07-04 13:39:39

标签: isabelle

是否有可能在Isabelle / HOL中使用具有等价关系族的quotient_type机制来引用一系列相互递归的数据类型?

如果是这样,那么某个地方有一个很好的例子吗?搜索Isabelle文档以及描述经过改进的quotient_type机制的文章并不是非常有用。

1 个答案:

答案 0 :(得分:2)

命令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,然后从q再到q1q2)以获取定义和两个解除提升的步骤证明。