在 Coq 中归纳定义整数(归纳定义受制于关系)
Defining integers inductively in Coq (inductive definitions subject to relations)
在 Coq 中,可以归纳地定义自然数如下:
Inductive nat :=
| zero : nat
| succ : nat -> nat.
我想知道是否可以以类似的方式归纳定义 整数 ?我可以做类似
的事情
Inductive int :=
| zero : int
| succ : int -> int
| pred : int -> int.
但是我想在 int
的 定义 中断言 succ(pred x) = x
和 pred(succ x) = x
,我不确定如何这样做。
您真正要求的是商归纳类型 (QIT),目前在 Coq 中不受支持,尽管有一种方法可以使用私有归纳类型来绕过此限制(请参阅 these slides实例)。不用说,它离推荐的选项还很远(至少在 Coq 中,cubical-agda 的情况有所不同,它支持 HIT,QIT 的通用版本)。
一般来说,Coq 不提供任意商。标准解决方案要么转到 setoids(即配备了等价关系的类型,并表明您的所有结构都保留了这些等价关系,这是相当沉重的),要么使用您想要做的商的特定方面(参见 this paper).整数的情况实际上是该论文的主要例子之一。
在 Coq 中,可以归纳地定义自然数如下:
Inductive nat :=
| zero : nat
| succ : nat -> nat.
我想知道是否可以以类似的方式归纳定义 整数 ?我可以做类似
的事情Inductive int :=
| zero : int
| succ : int -> int
| pred : int -> int.
但是我想在 int
的 定义 中断言 succ(pred x) = x
和 pred(succ x) = x
,我不确定如何这样做。
您真正要求的是商归纳类型 (QIT),目前在 Coq 中不受支持,尽管有一种方法可以使用私有归纳类型来绕过此限制(请参阅 these slides实例)。不用说,它离推荐的选项还很远(至少在 Coq 中,cubical-agda 的情况有所不同,它支持 HIT,QIT 的通用版本)。
一般来说,Coq 不提供任意商。标准解决方案要么转到 setoids(即配备了等价关系的类型,并表明您的所有结构都保留了这些等价关系,这是相当沉重的),要么使用您想要做的商的特定方面(参见 this paper).整数的情况实际上是该论文的主要例子之一。