intros goal l b0 b1 gamma work context j spec0.
unfold search_spec in |- *.
intros below_goal below_gamma below_context sound0 minimal0.
elim spec0; clear spec0; try assumption.
intros der_goal; apply derivable; assumption.
intros k k_is_mon k_forces_gamma k_notforces_goal.
apply refutable with k; try assumption.
apply forces_gamma_cons_gamma_weak2 with (vimp l b0) (vimp l b1);
try assumption.
intros forces_ab0 forces_ab1.
apply forces_vimp2 with b0 b1; try assumption.
intros; split; assumption.
apply below_list_weak2 with (vimp l (AndF b0 b1)); try assumption.
intros below_ab0b1.
split.
apply below_vimp with (AndF b0 b1); try assumption.
intros j' below_b0b1; elim below_b0b1; clear below_b0b1; intros; assumption.
apply below_vimp with (AndF b0 b1); try assumption.
intros j' below_b0b1; elim below_b0b1; clear below_b0b1; intros; assumption.
apply sound_cons_gamma_weak2 with (vimp l (AndF b0 b1)); try assumption.
intros der.
split.
apply derivable_vimp with (AndF b0 b1); try assumption.
intros context' der'.
apply (derivable_a_and_b__derivable_a b0 b1 context'); assumption.
apply derivable_vimp with (AndF b0 b1); try assumption.
intros context' der'.
apply (derivable_a_and_b__derivable_b b0 b1 context'); assumption.
apply minimal_cons_gamma_weak2 with (vimp l (AndF b0 b1)); try assumption.
intros k k_is_mon forces_b0 forces_b1.
apply forces_vimp2 with b0 b1; try assumption.
intros; split; assumption.
Qed.

(* Specifications: *)
Lemma rule_vimp_conj_gamma_new :
forall (goal : form) (l : list Int) (b0 b1 : form)
(gamma : flist) (work : nf_list) (context : flist)
(j j1 : Int),
Less j j1 ->
search_spec goal (vimp (j :: nil) b0 :: vimp (j :: nil) b1 :: gamma)
(nvimp l (NAtom j) :: work)
(vimp l (Atom j) :: Imp (Atom j) (AndF b0 b1) :: context) j1 ->
search_spec goal (vimp l (AndF b0 b1) :: gamma) work context j.