私はしばらくの間、問題に行き詰まりました。そのために、より小さなスタンドアロンの例を導き出しました。
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.
これは適切に型付けされた用語であり、暗黙的なものは何もありません。