intros goal l a0 a1 b 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_weak with (vimp l (Imp a0 (Imp a1 b)));
try assumption.
intros forces_a0a1b.
apply forces_vimp with (Imp a0 (Imp a1 b)); try assumption.
intros k' suc1 forces1.
unfold forces_t2 in |- *;
apply forces_a0_imp_a1_imp_b__forces_a0_and_a1_imp_b;
try assumption.
apply kripke_tree_kripke_model; assumption.
apply below_list_weak with (vimp l (Imp (AndF a0 a1) b)); try assumption.
intros below_lab.
apply below_vimp with (Imp (AndF a0 a1) b); try assumption.
intros j' below_ab; elim below_ab; clear below_ab; intros below_a below_b.
elim below_a; clear below_a; intros below_a0 below_a1.
split.
assumption.
split; assumption.
apply sound_cons_gamma_weak with (vimp l (Imp (AndF a0 a1) b));
try assumption.
intros der.
apply derivable_vimp with (Imp (AndF a0 a1) b); try assumption.
intros context' der'.
apply derivable_a0_and_a1_imp_b__derivable_a0_imp_a1_imp_b; assumption.
apply minimal_cons_gamma_weak with (vimp l (Imp (AndF a0 a1) b));
try assumption.
intros k k_is_mon forces1.
apply forces_vimp with (Imp a0 (Imp a1 b)); try assumption.
intros k' suc1 forces'.
unfold forces_t2 in |- *;
apply forces_a0_imp_a1_imp_b__forces_a0_and_a1_imp_b;
try assumption.
apply kripke_tree_kripke_model; assumption.
Qed.
(**************************************************************)
(* rules for   ...(cons (vimp l (Imp (OrF a0 a1) b)) gamma)... *)

Lemma rule_vimp_or_imp_gamma :
forall (goal : form) (l : list Int) (a0 a1 b : form)
(gamma : flist) (work : nf_list) (context : flist)
(j : Int),
search_spec goal (vimp l (Imp a0 b) :: vimp l (Imp a1 b) :: gamma) work
context j ->
search_spec goal (vimp l (Imp (OrF a0 a1) b) :: gamma) work context j.