На какое-то время я застрял в проблеме, для которой я привел небольшой автономный пример:
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 принимает это, набирая forall n : nat, n = n -> Prop
.
Итак, что не так с этим сообщением об ошибке, и как я могу решить / настроить свою первоначальную цель?
Кстати, это все coq8.3. Если что-то исправлено в 8.4, пожалуйста, сообщите мне и приношу свои извинения! :)
РЕДАКТИРОВАТЬ: Чтобы обратиться к комментарию Робина Грина, вот 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.
Это хорошо набранный термин, и ничего не подразумевается.
Set Printing All.
- person Robin Green   schedule 15.02.2013eq
, и это, похоже, вообще не приводит к нетипизированности ... - person Ptival   schedule 15.02.2013(e : n = n)
nat
неявно, но выводимо. В_ = _n
два параметра типа не должны указываться, должны быть названы только индексы. Вv = x
f n
неявно, но выводимо. Я не думаю, что здесь есть проблема с имплицитами. - person Ptival   schedule 15.02.2013