Coq 试着理解索引类型族的概念

Coq 试着理解索引类型族的概念,coq,type-families,Coq,Type Families,定义如下: Inductive eq (A : Type) (x : A) : A → Prop := eq refl : (eq x) x Parameter a b : A. 当我考虑它的一个实例 EQ一个B时,我读了(EQA)类型 A--> PROP。p> 那么,我的问题是(eq a)b如何确定a和b对应于同一个对象 对我来说奇怪的是,我们没有关于(eq a)实际做什么的信息。eq a是一个谓词,只有在其参数等于b时才被定义(只有居住者eq_refl),其中equality意味着“直到

定义如下:

Inductive eq (A : Type) (x : A) : A → Prop := eq refl : (eq x) x

Parameter a b : A.

当我考虑它的一个实例<代码> EQ一个B<代码>时,我读了<代码>(EQA)<代码>类型<代码> A--> PROP。p> 那么,我的问题是

(eq a)b
如何确定
a
b
对应于同一个对象


对我来说奇怪的是,我们没有关于
(eq a)
实际做什么的信息。

eq a是一个谓词,只有在其参数等于b时才被定义(只有居住者eq_refl),其中equality意味着“直到类型检查器统一”。所以Coq必须看到a与b相同,否则Eq等于False

Eq a是一个谓词,只有在其参数等于b时才被定义(只有居住者Eq_refl),其中equality表示“直到类型检查器统一”。所以Coq必须看到a与b相同,否则Eq等于False

为了补充John的答案,人们似乎很欣赏我在这里给出的关于我如何直观地思考索引类型族的非正式描述:

我还要补充一点,类型
(eq a)b
(与
eq a b
相同)和具有此类型的术语之间存在区别

例如,您可以定义:

Definition a_weird_type : Type := eq 0 42.
因为这样的类型只是一个没有证明的语句。但是,您不能定义类型为
a\u-weird\u-type
a\u-weird\u-type
术语,因为您永远无法说服系统0和42实际上相等

请注意,仍然有一些检查,因此您无法定义:

Definition a_weirder_type : Type := eq 42 true. (* Coq will reject this *)
因为
eq
类型隐式地携带它所比较的元素的类型,并且类型系统将确保这两个元素具有该类型:

Check (@eq nat 42 true).
(*                ^^^^ this should have type nat *)

Check (@eq bool 42 true).
(*              ^^ this should have type bool *)

Check (@eq nat 23 42).
(* fine, but not provable *)

为了补充John的答案,人们似乎很欣赏我在这里给出的关于我如何直观地思考索引类型族的非正式描述:

我还要补充一点,类型
(eq a)b
(与
eq a b
相同)和具有此类型的术语之间存在区别

例如,您可以定义:

Definition a_weird_type : Type := eq 0 42.
因为这样的类型只是一个没有证明的语句。但是,您不能定义类型为
a\u-weird\u-type
a\u-weird\u-type
术语,因为您永远无法说服系统0和42实际上相等

请注意,仍然有一些检查,因此您无法定义:

Definition a_weirder_type : Type := eq 42 true. (* Coq will reject this *)
因为
eq
类型隐式地携带它所比较的元素的类型,并且类型系统将确保这两个元素具有该类型:

Check (@eq nat 42 true).
(*                ^^^^ this should have type nat *)

Check (@eq bool 42 true).
(*              ^^ this should have type bool *)

Check (@eq nat 23 42).
(* fine, but not provable *)