intros a gamma work context j j1 less1 spec0.
unfold search_spec in |- *.
intros below_goal below_gamma below_context sound0 minimal0.
elim spec0; clear spec0; try assumption.
intros der.
clear minimal0 sound0.
apply derivable.
apply derivable_cut with (Imp a a).
apply derivable_a_imp_a.
apply
derivable_eq
with (subst_list j a (Imp a (Atom j) :: context)) (subst_form j a (Atom j)).
simpl in |- *.
rewrite (subst_form_below j a a); try assumption.
rewrite (subst_list_below j a context); try assumption.
rewrite (equal_dec_refl j form a (Atom j)).
trivial.
simpl in |- *.
apply equal_dec_refl.
apply derivable_subst; assumption.
clear minimal0 sound0.
intros k k_is_mon k_forces_gamma k_notforces_j.
apply refutable with k; try assumption.
apply forces_gamma_cons_gamma_tail with (Imp a (Atom j)); assumption.
intros forces_a.
apply k_notforces_j.
apply forces_a_a_imp_b__forces_b_t with a; try assumption.
apply forces_gamma_cons_gamma_head with gamma work; assumption.
apply below_cons_list.
split.
apply below_form_less_below_form with j; assumption.
assumption.
apply below_list_less_below_list with j; assumption.
apply below_cons_list.
split.
apply below_form_less_below_form with j; assumption.
assumption.
apply below_list_less_below_list with j; assumption.
apply sound_cons_gamma_cons_context; assumption.
apply minimal_cons_gamma_cons_context; assumption.
Qed.
(***********************************************************************)
(***********************************************************************)
(*****************************************************)
(* rules for   ...(cons (vimp l (AndF a b)) gamma)... *)

Lemma rule_vimp_conj_gamma :
forall (goal : form) (l : list Int) (b0 b1 : form)
(gamma : flist) (work : nf_list) (context : flist)
(j : Int),
search_spec goal (vimp l b0 :: vimp l b1 :: gamma) work context j ->
search_spec goal (vimp l (AndF b0 b1) :: gamma) work context j.