Fixpoint rev {X : Type} {n : nat} (v : @vect X n X) : @vect X n X :=
fold_left (fun {X : Type} {k : nat} (acc : vect k X) (x : X) => Cons x acc) Nil v.
fold_left ?1 -> ?2 -> ?1, , . [Dependent] "product" - Coq . fun (X:Type) b c d => …, ?1 - Type, fun c d => … (, , ) ?, , Type, .. .
, , fold_left : , fold_left . fold_left, Nil, 0, , 0.
, , rev, , .
, vect (n0 + 1) X vect (S n0) X , , n0 + 1 S n0. n0 + 1 , , , , , .
, , "" . , - eq_rect, . - - .
Definition vect_eq_nat {X : Type} {m n : nat} (H : m = n) v :=
eq_rect _ (fun k => @vect X k X) v _ H.
eq_rect , . , , , , .
Definition vect_eq_nat {X : Type} {m n : nat} : m = n -> @vect X m X -> @vect X n X.
intros.
rewrite <- H.
exact X0.
Defined.
Print vect_eq_nat.
Program .
Program Definition vect_plus_comm {X : Type} {n : nat} (v : @vect X (n+1) X) : @vect X (S n) X :=
vect_eq_nat _ v.
Require Import Arith.
Require Import Omega.
Solve Obligation 0 using (intros; omega).
rev.
Fixpoint rev {X : Type} {n : nat} (v : @vect X n X) : @vect X n X :=
match v in (vect n X) return (vect n X) with
| Nil => Nil
| Cons _ x xs => vect_plus_comm (app (rev xs) (Cons _ x Nil))
end.
Program Fixpoint, rev , . S n0 n0 + 1.
Program Fixpoint rev' {X : Type} {n : nat} (v : @vect X n X) : @vect X n X :=
match v in (vect n X) return (vect n X) with
| Nil => Nil
| Cons _ x xs => vect_eq_nat _ (app (rev' xs) (Cons _ x Nil))
end.
Solve Obligation 0 using (intros; omega).