是否有可能在Isabelle / HOL中使用具有等价关系族的quotient_type
机制来引用一系列相互递归的数据类型?
如果是这样,那么某个地方有一个很好的例子吗?搜索Isabelle文档以及描述经过改进的quotient_type
机制的文章并不是非常有用。
答案 0 :(得分:2)
命令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
)以获取定义和两个解除提升的步骤证明。