intros goal l i a gamma work context j j1 less1 spec0.
apply
search_spec_subst_gamma_pos
with (j1 := j1) (a := a) (b := vimp l (OrF (Atom i) (Atom j)));
try assumption.
intros below_c.
generalize (below_vimp_tail j l (OrF (Atom i) a) below_c).
generalize (below_vimp_head j l (OrF (Atom i) a) below_c); clear below_c.
intros below_c below_l; elim below_c; clear below_c; intros below_i below_a.
split.
assumption.
split.
apply below_vimp_split.
intros i0 in0.
apply less_trans with j; try assumption.
apply below_l; assumption.
split.
apply below_form_less_below_form with j; try assumption.
assumption.
rewrite (subst_vimp_head j a l (OrF (Atom i) (Atom j))); try assumption.
change
(vimp l (OrF (subst_form j a (Atom i)) (subst_form j a (Atom j))) =
vimp l (OrF (Atom i) a)) in |- *.
rewrite (subst_form_below j a (Atom i)); 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 (OrF (Atom i) (Atom j)).
intros k' suc1 forces_ij.
elim forces_ij; clear forces_ij.
intros; left; assumption.
intros; right.
change (forces_t2 k k' a) in |- *.
apply (forces2 k'); assumption.
assumption.
apply rule_shift_gamma_work with (a := NDisj i j); assumption.
Qed.

(* Specifications: *)
Lemma rule_vimp_a_or_b_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 (OrF (Atom j) b) :: vimp (j :: nil) a :: gamma)
work (vimp l (OrF (Atom j) b) :: Imp (Atom j) a :: context) j1 ->
search_spec goal (vimp l (OrF a b) :: gamma) work context j.