Isabelle 相互递归的数据类型族的商

Isabelle 相互递归的数据类型族的商,isabelle,Isabelle,在Isabelle/HOL中,是否可以使用具有一系列等价关系的商类型机制对一系列相互递归的数据类型进行商 如果是这样的话,有没有一个很好的例子?搜索Isabelle文档,以及描述改进后的商类型机制的文章,都没有什么帮助。命令商类型一次只能处理一种类型。如果你想在几个相互类型上做一个商,你必须手工进行编码和解码,但是这很简单 假设您的两种类型是t1和t2,具有等价关系r1::t1=>t1=>bool和r2::t2=>t2=>bool。那么 quotient_type q = "t1 + t2" /

在Isabelle/HOL中,是否可以使用具有一系列等价关系的
商类型
机制对一系列相互递归的数据类型进行商


如果是这样的话,有没有一个很好的例子?搜索Isabelle文档,以及描述改进后的
商类型
机制的文章,都没有什么帮助。

命令
商类型
一次只能处理一种类型。如果你想在几个相互类型上做一个商,你必须手工进行编码和解码,但是这很简单

假设您的两种类型是
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\u lifting
,您也可以在提升包中注册
q1
q2
。然后,您将获得提升证明和定义的良好自动化。您只需执行两个提升步骤(首先从
t1+t2
q
,然后从
q
q1
q2
)进行定义,然后执行两个取消提升步骤进行证明。

命令
商类型
一次只能处理一种类型。如果你想在几个相互类型上做一个商,你必须手工进行编码和解码,但是这很简单

假设您的两种类型是
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\u lifting
,您也可以在提升包中注册
q1
q2
。然后,您将获得提升证明和定义的良好自动化。你只需要做两个提升步骤(首先从
t1+t2
q
,然后从
q
q1
q2
)来定义和两个取消提升步骤来证明。

谢谢,这正是我想要的。顺便说一句,这个技巧也许可以添加到Isabelle文档中。谢谢,这正是我想要的。顺便说一句,这个技巧也许可以添加到Isabelle文档中。