Definition decay' {X} {F: Type} {l: list X} (v: ListType (map (fun _ => F) l)): list F.Fixpoint decay'' {X} {F: Type} (l0 : list Type) (v: ListType l0) :
  forall (l: list X), l0 = map (fun _ => F) l -> list F :=
  match v in ListType l1
    return forall l2, l1 = map (fun _ => F) l2 -> list F
  with
  | Nil => fun _ _ => nil
  | Cons A B a b =>
    fun (l1 : list X) (E0 : A :: B = map (fun _ : X => F) l1) =>
    match l1 as l2 return (A :: B = map (fun _ : X => F) l2 -> list F) with
    | nil => fun _ => nil (* impossible case *)
    | x :: l2 =>
       fun E1 : A :: B = map (fun _ : X => F) (x :: l2) =>
       (fun
          X0 : map (fun _ : X => F) (x :: l2) =
               map (fun _ : X => F) (x :: l2) -> list F =>
        X0 eq_refl)
         match
           E1 in (_ = y)
           return (y = map (fun _ : X => F) (x :: l2) -> list F)
         with
         | eq_refl =>
             fun H0 : A :: B = map (fun _ : X => F) (x :: l2) =>
              (fun (H3 : A = F) (H4 : B = map (fun _ : X => F) l2) =>
                  (eq_rect A (fun A0 : Type => A0) a F H3) :: (decay'' B b l2 H4))
                 (f_equal
                    (fun e : list Type =>
                     match e with
                     | nil => A
                     | T :: _ => T
                     end) H0)
                (f_equal
                   (fun e : list Type =>
                    match e with
                    | nil => B
                    | _ :: l3 => l3
                    end) H0)
         end
    end E0
  end.Definition decay {X} {F: Type} {l: list X} (v: ListType (map (fun _ => F) l)): list F :=
  let l0 := map (fun _ => F) l in
  let E := @eq_refl _ (map (fun _ => F) l) : l0 = map (fun _ => F) l in
  decay'' l0 v l E.

(* Specifications: *)
Lemma decay_spec: forall A F f l, decay (ListTypeGen (fun _: A => F) f l) = map f l.
Lemma type_ind: forall P : type -> Prop, (forall t, match t with | Tarray t0 _ _ => P t0 | Tstruct id _ => let m := co_members (get_co id) in Forall (fun it => P (field_type (fst it) m)) m | Tunion id _ => let m := co_members (get_co id) in Forall (fun it => P (field_type (fst it) m)) m | _ => True end -> P t) -> forall t, P t.
Lemma decay_spec: forall A F f l, decay (ListTypeGen (fun _: A => F) f l) = map f l.
Lemma type_ind: forall P : type -> Prop, (forall t, match t with | Tstruct id => let m := co_members (get_co id) in Forall (fun it => P (field_type (fst it) m)) m | _ => True end -> P t) -> forall t, P t.