intros goal l a c gamma work context j j1 less1 spec0.
unfold search_spec in |- *.
intros below_goal below_gamma below_context sound0 minimal0.
generalize
(below_cons_list_head (vimp l (Imp (Imp a Falsum) c)) gamma j below_gamma).
intros below_lc.
generalize
(below_cons_list_tail (vimp l (Imp (Imp a Falsum) c)) gamma j below_gamma).
clear below_gamma; intros below_gamma.
elim (below_vimp_head j l (Imp (Imp a Falsum) c) below_lc).
intros below_a_falsum; elim below_a_falsum; clear below_a_falsum.
intros below_a below_falsum below_c.
generalize (below_vimp_tail j l (Imp (Imp a Falsum) c) below_lc);
clear below_lc.
intros below_l.
elim spec0; clear spec0; try assumption.
clear minimal0.
intros der_goal.
apply derivable.
apply derivable_cut_merge with (vimp l (Imp (Imp a Falsum) c)).
apply sound0.
apply in_gamma_cons_gamma_head.
apply
derivable_eq
with
(subst_list j Falsum (vimp l (Imp (Imp a (Atom j)) c) :: context))
(subst_form j Falsum goal).
simpl in |- *.
rewrite (subst_vimp_head j Falsum l (Imp (Imp a (Atom j)) c)).
simpl in |- *.
rewrite (subst_form_below j Falsum a); try assumption.
rewrite (subst_form_below j Falsum c); try assumption.
rewrite (equal_dec_refl j form Falsum (Atom j)).
rewrite (subst_list_below j Falsum context); try assumption.
trivial.
assumption.
apply subst_form_below; assumption.
apply derivable_subst; assumption.
clear minimal0.
intros k k_is_mon k_forces_gamma k_notforces_goal.
apply refutable with k; try assumption.
apply forces_gamma_cons_gamma_weak with (vimp l (Imp (Imp a (Atom j)) c));
try assumption.
intros forces_lc.
apply forces_vimp with (Imp (Imp a (Atom j)) c); try assumption.
intros k' suc1 forces1.
apply forces_a_imp_b_imp_c__forces_a_imp_falsum_imp_c_t2 with (Atom j);
assumption.
apply below_form_less_below_form with j; assumption.
apply below_cons_list.
apply below_vimp_split.
intros i0 in0.
apply less_trans with j; try assumption.
apply below_l; assumption.
split.
split.
apply below_form_less_below_form with j; assumption.
assumption.
apply below_form_less_below_form with j; assumption.
apply below_list_less_below_list with j; assumption.
apply below_cons_list.
apply below_vimp_split.
intros i0 in0.
apply less_trans with j; try assumption.
apply below_l; assumption.
split.
split.
apply below_form_less_below_form with j; assumption.
assumption.
apply below_form_less_below_form with j; assumption.
apply below_list_less_below_list with j; assumption.
apply sound_cons_gamma_cons_context.
apply sound_cons_gamma_tail with (vimp l (Imp (Imp a Falsum) c)); assumption.
unfold minimal in |- *.
intros x k k_is_mon k_forces_gamma in_x.
inversion_clear in_x.
rewrite <- H; clear H x.
apply k_forces_gamma.
apply in_gamma_cons_gamma_head.
apply minimal0; try assumption; clear H.
apply forces_gamma_cons_gamma_weak with (vimp l (Imp (Imp a (Atom j)) c));
try assumption.
intros forces1.
apply forces_vimp with (Imp (Imp a (Atom j)) c); try assumption.
intros k' suc1 forces2.
apply forces_a_imp_b_imp_c__forces_a_imp_falsum_imp_c_t2 with (Atom j);
assumption.
Qed.

Lemma rule_atom_imp_atom_imp_c_gamma :
forall (goal : form) (l : list Int) (a b : Int) (c : form)
(gamma : flist) (work : nf_list) (context : flist)
(j j1 : Int),
Less j j1 ->
search_spec goal (Imp (Atom j) c :: gamma)
(nvimp l (NImp_NF (NImp a b (NAtom j))) :: work)
(vimp l (Imp (Imp (Atom a) (Atom b)) (Atom j))
:: Imp (Atom j) c :: context) j1 ->
search_spec goal (vimp l (Imp (Imp (Atom a) (Atom b)) c) :: gamma) work
context j.