Section gram4.
Variable X V1 R1 : Ensf.
Variable S1 : Elt.
Variable V2 R2 : Ensf.
Variable S2 : Elt.
Variable S : Elt.
Let C := Gunion_disj_p V1 R1 S1 V2 R2 S2 S.
Let Vu := fst C.
Let C' := snd C.
Let Ru := fst C'.
Let Su := snd C'.
prolog [ isGram2 union_inter ] 5.
(*Intro G1. Intro G2. Apply union_inter. Apply isGram2 with R1 S1; Assumption. Apply isGram2 with R2 S2; Assumption.*)
Qed.
intros G_1 G_2 N_dans_S_X.
unfold inter in |- *.
split.
auto.
split.
auto.
intros x dans_x_X dans_x_Vu.
absurd (dans x X).
cut (S = x :>Elt \/ dans x (union V1 V2)). (**)
intro temp; elim temp; clear temp.
intros egal_S_x.
rewrite <- egal_S_x; assumption.
intro dans_x_V1_u_V2.
prolog [ inter_X_V1_u_V2 sym_inter inter_dans ] 4.
(*Apply inter_dans with (union V1 V2). Apply sym_inter. Apply inter_X_V1_u_V2;Assumption.  Assumption.*)
(**)auto.  assumption. Qed.  Lemma Gunion_disj_Regles : isGram X V1 R1 S1 -> isGram X V2 R2 S2 -> Regles X Vu Ru. intros. unfold Vu, Ru in |- *; simpl in |- *. apply Regles_add. apply Regles_add. apply Regles_add2. change (Regles X (fst (Gunion V1 R1 V2 R2)) (snd (Gunion V1 R1 V2 R2))) in |- *. prolog [ Gunion_Regles ] 2. (*Apply Gunion_Regles with S1 S2;Auto.*)
auto.
apply inmonoid_cons.
trivial.
cut (dans S2 V2);
[ auto
| prolog [ isGram3 ] 2(*Apply isGram3 with X R2;Assumption*) ].
auto.
apply inmonoid_cons.
trivial.
cut (dans S1 V1);
[ auto
| prolog [ isGram3 ] 2 (*Apply isGram3 with X R1;Assumption*) ].
Qed.

Lemma inmon_Der_imp_Der_d :
~ dans S X ->
~ dans S V1 ->
~ dans S V2 ->
Regles X V1 R1 ->
Regles X V2 R2 ->
inter (union X V1) V2 empty ->
forall u v : Word, Derive Ru u v -> inmonoid (union X V1) u -> Derive R1 u v.