我注意到Coq合成了Prop和Type相等的不同归纳原则。有没有人对此有解释?
平等定义为
Inductive eq (A : Type) (x : A) : A -> Prop := eq_refl : x = x
相关的归纳原理有以下几种类型:
eq_ind
: forall (A : Type) (x : A) (P : A -> Prop),
P x -> forall y : A, x = y -> P y
现在让我们定义一个等式的挂件:
Inductive eqT {A:Type}(x:A):A->Type:= eqT_refl: eqT x x.
自动生成的归纳原理是
eqT_ind
: forall (A : Type) (x : A) (P : forall a : A, eqT x a -> Prop),
P x (eqT_refl x) -> forall (y : A) (e : eqT x y), P y e
答案 0 :(得分:4)
注意:我将在所有地方使用_rect
原则而不是_ind
,因为_ind
原则通常是通过_rect
实现的的。
eqT_rect
让我们来看一下谓词P
。
处理归纳族时,P
的参数数量等于非参数参数(索引)+ 1的数量。
让我举几个例子(可以很容易地跳过它们)。
自然数字根本没有参数:
Inductive nat : Set := O : nat | S : nat -> nat.
因此,谓词P
的类型为nat -> Type
。
列表有一个参数化参数(A
):
Inductive list (A : Type) : Type :=
nil : list A | cons : A -> list A -> list A.
同样,P
只有一个参数:P : list A -> Type
。
向量是不同的:
Inductive vec (A : Type) : nat -> Type :=
nil : vec A 0
| cons : A -> forall n : nat, vec A n -> vec A (S n).
P
有2个参数,因为n
中的vec A n
是非参数参数:
P : forall n : nat, vec A n -> Type
以上解释了eqT_rect
(当然,eqT_ind
因此而来),因为(x : A)
之后的参数是非参数的,P
有2个参数:
P : forall a : A, eqT x a -> Type
证明了eqT_rect
的整体类型:
eqT_rect
: forall (A : Type) (x : A) (P : forall a : A, eqT x a -> Type),
P x (eqT_refl x) -> forall (y : A) (e : eqT x y), P y e
以这种方式获得的归纳原理称为最大归纳原理。
eq_rect
为归纳谓词(例如eq
)生成的归纳原则被简化以表示证明不相关(这个术语是简化归纳原理)。
在定义谓词P
时,Coq只删除谓词的最后一个参数(它是被定义的类型,它存在于Prop
中)。这就是eq_rect
中使用的谓词是一元的原因。这个事实塑造了eq_rect
:
eq_rect :
forall (A : Type) (x : A) (P : A -> Type),
P x -> forall y : A, x = y -> P y
我们还可以使Coq为eq
生成非简化归纳原理:
Scheme eq_rect_max := Induction for eq Sort Type.
结果类型是
eq_rect_max :
forall (A : Type) (x : A) (P : forall a : A, x = a -> Type),
P x eq_refl -> forall (y : A) (e : x = y), P y e
,它与eqT_rect
具有相同的结构。
有关详细说明,请参阅教派。 14.1.3 ...... Bertot和Castéran(2004)“交互式定理证明和程序开发(Coq'Art:归纳构造的微积分)”一书中的14.1.6。