intros goal l a gamma work context j j1 less1 spec0.
apply
search_spec_subst_gamma_pos with (j1 := j1) (a := a) (b := vimp l (Atom j));
try assumption.
intros below_c.
generalize (below_vimp_tail j l a below_c).
generalize (below_vimp_head j l a below_c); clear below_c.
intros below_a below_l.
split.
assumption.
split.
apply below_vimp_split; try assumption.
intros i in0.
apply less_trans with j; try assumption.
apply below_l; assumption.
rewrite (subst_vimp_head j a l (Atom j)); try assumption.
simpl in |- *.
rewrite (equal_dec_refl j form a (Atom j)).
trivial.
intros k k_is_mon forces1 forces2.
apply forces_vimp with (Atom j); try assumption.
intros k' suc1 forces_j.
apply (forces2 k'); assumption.
apply rule_shift_gamma_work with (a := NAtom j); assumption.
Qed.

Lemma rule_vimp_imp_gamma :
forall (goal : form) (l : list Int) (a b : form) (gamma : flist)
(work : nf_list) (context : flist) (j j1 : Int),
Less j j1 ->
search_spec goal (vimp l (Imp a (Atom j)) :: vimp (j :: nil) b :: gamma)
work (vimp l (Imp a (Atom j)) :: Imp (Atom j) b :: context) j1 ->
search_spec goal (vimp l (Imp a b) :: gamma) work context j.