如何在 Coq 中定义 N 个元素的有限集?

How to define finite set of N elements in Coq?

如何为一般参数 N:nat 定义 N 个元素的有限集 $ A_{0},...A_{N-1} $ ? 有没有一种优雅的方法可以通过递归定义来做到这一点?有人能给我指出推理这种结构的好例子吗?

一个非常方便的解决方案是定义第n个序数,'I_n作为记录:

Record ordinal n := {
    val :> nat;
    _   : val < n;
}.

也就是说,一对自然数,再加上这个自然数小于n的证明,其中< : nat -> nat -> bool。在这里使用可计算的比较运算符非常方便,特别是证明本身不是很"important",这是你通常想要的。

这是 math-comp 中使用的解决方案,它具有很好的属性,主要是 valval_inj : injective val 的单射性,这意味着您可以重用大部分标准操作nat 使用您的新数据类型。请注意,您可能希望将加法定义为 add i j := max n.-1 (i+j)(i+j) %% n.

此外,上面链接的库提供了使用有限类型的一般定义,包括它们与其基数序数的双射。