我被一个问题困住了一段时间,为此我得出了一个较小的独立示例:
Axiom f : nat -> Set.
Goal forall (n : nat) (e : n = n) (x : f n),
match e in _ = _n return f _n -> Prop with
| Logic.eq_refl => fun v : f n => v = x
end x.
现在,如果您尝试destruct e
,您会收到以下错误消息:
Error: Abstracting over the terms "n0" and "e" leads to a term
"fun (n0 : nat) (e : n0 = n0) =>
forall x : f n0,
match e in (_ = _n) return (f _n -> Prop) with
| Logic.eq_refl => fun v : f n0 => v = x
end x" which is ill-typed.
在挠了一阵头之后,我无法弄清楚那个术语中的错误类型......所以我尝试了这个:
Definition illt :=
fun (n : nat) (e : n = n) =>
forall x : f n,
match e in _ = _n return f _n -> Prop with
| Logic.eq_refl => fun v : f n => v = x
end x.
Coq 接受它,在 type forall n : nat, n = n -> Prop
。
那么,此错误消息有什么问题,我该如何解决/调整我的初始目标?
顺便说一句,这都是coq8.3。如果这是 8.4 中修复的问题,请告诉我,我很抱歉!:)
编辑:为了解决 Robin Green 的评论,这里是Set Printing All
错误消息的版本:
Error: Abstracting over the terms "n0" and "e" leads to a term
"fun (n0 : nat) (e : @eq nat n0 n0) =>
forall x : f n0,
match e in (@eq _ _ _n) return (f _n -> Prop) with
| eq_refl => fun v : f n0 => @eq (f n0) v x
end x" which is ill-typed.
这是一个类型良好的术语,没有什么是隐含的。