Coq 可判定子集类型术语的简单语法

Coq 可判定子集类型术语的简单语法,coq,Coq,我有一个BoundedNat n类型,表示小于n的自然数。我目前的执行情况如下: Definition BoundedNat n := {x : nat | x < n}. BoundedNat n类型的操纵元素相对较重。我经常需要使用exist n ltac:lia进行包装,并使用proj1_sig元素进行展开。如何才能最好地利用基础类型的符号、等式、排序等?尽管您肯定可以使用自己的有界自然数实现,但我强烈建议您重用现有的有界自然数实现。我最喜欢的库是ssreflect。它包含一个与f

我有一个BoundedNat n类型,表示小于n的自然数。我目前的执行情况如下:

Definition BoundedNat n := {x : nat | x < n}.

BoundedNat n类型的操纵元素相对较重。我经常需要使用exist n ltac:lia进行包装,并使用proj1_sig元素进行展开。如何才能最好地利用基础类型的符号、等式、排序等?

尽管您肯定可以使用自己的有界自然数实现,但我强烈建议您重用现有的有界自然数实现。我最喜欢的库是ssreflect。它包含一个与fintype.v doc中定义的BoundedNat相对应的有序n类型族。有一种从序数到nat的强制,这样您就可以透明地重用自然数上的大多数运算符-例如,当i j:ordinal n时,您可以直接写入i 序数的构建项更为复杂,因为它需要证明参数。没有最好的方法找到这个证明,所以继续的方法取决于应用程序。例如,将常量添加到有界nat非常常见,因此在ssreflect中应该进行专门的操作:

rshift : forall m n,  ordinal n -> ordinal (m + n)

使用ssreflect的一个优点是,它附带了对像ordinal这样的子集类型的通用支持。例如,有一个insub:nat->option ordinal n函数,当a仅当其参数以n为界时,该函数才会成功。此函数不仅适用于nat和ordinal,而且适用于通过子类型接口连接的任何类型对:sT是T的子类型,如果对于某些布尔谓词P,其形式为{x:T | px}。因此,您可以使用一致的接口来操作子类型,而不是每次都卷起您自己的子类型。

虽然您肯定可以卷起您自己的有界自然数实现,但我强烈建议您重用现有的子类型。我最喜欢的库是ssreflect。它包含一个与fintype.v doc中定义的BoundedNat相对应的有序n类型族。有一种从序数到nat的强制,这样您就可以透明地重用自然数上的大多数运算符-例如,当i j:ordinal n时,您可以直接写入i 序数的构建项更为复杂,因为它需要证明参数。没有最好的方法找到这个证明,所以继续的方法取决于应用程序。例如,将常量添加到有界nat非常常见,因此在ssreflect中应该进行专门的操作:

rshift : forall m n,  ordinal n -> ordinal (m + n)
使用ssreflect的一个优点是,它附带了对像ordinal这样的子集类型的通用支持。例如,有一个insub:nat->option ordinal n函数,当a仅当其参数以n为界时,该函数才会成功。此函数不仅适用于nat和ordinal,而且适用于由子类型接口连接的任何类型对:对于某些布尔谓词P,sT的形式为{x:T | px}时,它是T的子类型。因此,您可以使用一致的接口操作子类型,而不是每次滚动自己的子类型