具有以下定义:
Inductive eq (A : Type) (x : A) : A → Prop := eq refl : (eq x) x
Parameter a b : A.
当我考虑其中一个实例eq a b
时,我读了(eq a)
类型的A -> Prop
。
然后,我的问题是(eq a) b
如何确定a
和b
对应同一个对象的事实?
对我来说奇怪的是,我们没有关于(eq a)
实际做什么的信息。
答案 0 :(得分:4)
为了补充John的答案,人们似乎很欣赏我在这里给出的关于我如何直观地思考索引类型系列的非正式描述:
https://stackoverflow.com/a/24601292/553003
我还要补充说,类型GroupBy
(与(eq a) b
相同)和具有此类型的术语之间存在区别。
例如,您可以定义:
eq a b
因为这种类型只是一个没有证明的陈述。您应该无法定义类型为Definition a_weird_type : Type := eq 0 42.
的{{1}},因为您永远不会说服系统0和42实际上是相等的。
请注意,仍有一些检查,所以你无法定义:
a_weird_term
因为a_weird_type
类型隐式携带它所比较的元素的类型,类型系统将确保这两个元素具有该类型:
Definition a_weirder_type : Type := eq 42 true. (* Coq will reject this *)
答案 1 :(得分:2)
等式a是一个仅定义的谓词(只有居民的eq_refl),如果它的参数等于b,则等式意味着"直到由类型检查器统一"。因此,Coq必须与b相同,否则Eq a b等于False。