intros context l.
elim l; clear l.
intros a b c der_abc der_a der_b.
apply der_abc; assumption.
simpl in |- *; intros i l ih a b c der_abc der_a der_b.
apply ih with (a := Imp (Atom i) a) (b := Imp (Atom i) b); try assumption.
clear ih.
intros context' der_ia der_ib.
elim der_ia; clear der_ia; intros t der_ia.
elim der_ib; clear der_ib; intros s der_ib.
elim (der_abc (Atom i :: context')).
intros r der_r.
apply Derivable_Intro with (Abs (Atom i) r).
apply ImpIntro; assumption.
apply Derivable_Intro with (App (Atom i) (Shift t) (Var 0)).
apply ImpElim.
apply ShiftIntro; assumption.
apply ByAssumption.
apply My_NthO.
apply Derivable_Intro with (App (Atom i) (Shift s) (Var 0)).
apply ImpElim.
apply ShiftIntro; assumption.
apply ByAssumption.
apply My_NthO.
Qed.

(* Specifications: *)
Lemma derivable_vimp0 :
forall (context : flist) (l : list Int) (a : form),
(forall context : flist, Derivable context a) ->
Derivable context (vimp l a).