Definition predta_produit_4_def (d0 : preDTA) : Prop :=
forall (a a0 : ad) (s s0 : state),
MapGet state (preDTA_produit_r a0 s0 d0) a = Some s ->
exists a1 : ad,
(exists a2 : ad,
(exists s1 : state,
(exists s2 : state,
a = iad_conv a1 a2 /\
MapGet state (M1 state a0 s0) a2 = Some s1 /\
MapGet state d0 a1 = Some s2))).

(* Specifications: *)
Lemma predta_produit_4_0 : predta_produit_4_def (M0 state).
Lemma predta_produit_4_1 :
forall (a : ad) (a0 : state), predta_produit_4_def (M1 state a a0).
Lemma predta_produit_4_2 :
forall m : preDTA,
predta_produit_4_def m ->
forall m0 : preDTA,
predta_produit_4_def m0 -> predta_produit_4_def (M2 state m m0).
Lemma predta_produit_4_3 : forall m : preDTA, predta_produit_4_def m.
Lemma predta_produit_4 :
forall (d0 : preDTA) (a a0 : ad) (s s0 : state),
MapGet state (preDTA_produit_r a0 s0 d0) a = Some s ->
exists a1 : ad,
(exists a2 : ad,
(exists s1 : state,
(exists s2 : state,
a = iad_conv a1 a2 /\
MapGet state (M1 state a0 s0) a2 = Some s1 /\
MapGet state d0 a1 = Some s2))).
Lemma predta_produit_5 :
forall (d0 d1 : preDTA) (a : ad) (s : state),
MapGet state (preDTA_produit d0 d1) a = Some s ->
exists a0 : ad,
(exists a1 : ad,
(exists s0 : state,
(exists s1 : state,
a = iad_conv a0 a1 /\
MapGet state d0 a0 = Some s0 /\
MapGet state d1 a1 = Some s1))).
Lemma pl_produit_rec_0 :
forall tl : term_list,
(forall u : term,
term_list_occur u tl ->
forall (d0 d1 : preDTA) (a0 a1 : ad),
predta_compatible d0 d1 ->
reconnaissance d0 a0 u ->
reconnaissance d1 a1 u ->
reconnaissance (preDTA_produit d0 d1) (iad_conv a0 a1) u) ->
forall (d0 d1 : preDTA) (plp0 plp1 : pl_path),
predta_compatible d0 d1 ->
pl_path_recon d0 tl plp0 ->
pl_path_recon d1 tl plp1 ->
pl_path_recon (preDTA_produit d0 d1) tl (pl_path_product plp0 plp1).
Lemma pl_produit_rec_1 :
forall (d0 d1 : preDTA) (tl : term_list) (pl0 pl1 : prec_list),
liste_reconnait d0 pl0 tl ->
liste_reconnait d1 pl1 tl ->
pl_tl_length pl0 (lst_length tl) ->
pl_tl_length pl1 (lst_length tl) ->
predta_compatible d0 d1 ->
(forall u : term,
term_list_occur u tl ->
forall (d0 d1 : preDTA) (a0 a1 : ad),
predta_compatible d0 d1 ->
reconnaissance d0 a0 u ->
reconnaissance d1 a1 u ->
reconnaissance (preDTA_produit d0 d1) (iad_conv a0 a1) u) ->
liste_reconnait (preDTA_produit d0 d1) (pl_produit pl0 pl1) tl.
Lemma pl_produit_rec_2 :
forall tl : term_list,
(forall u : term,
term_list_occur u tl ->
forall (d0 d1 : preDTA) (a0 a1 : ad),
predta_compatible d0 d1 ->
reconnaissance (preDTA_produit d0 d1) (iad_conv a0 a1) u ->
reconnaissance d0 a0 u /\ reconnaissance d1 a1 u) ->
forall (d0 d1 : preDTA) (plp : pl_path),
predta_compatible d0 d1 ->
pl_path_recon (preDTA_produit d0 d1) tl plp ->
exists plp0 : pl_path,
(exists plp1 : pl_path,
plp = pl_path_product plp0 plp1 /\
pl_path_recon d0 tl plp0 /\ pl_path_recon d1 tl plp1).
Lemma pl_produit_rec_3 :
forall (d0 d1 : preDTA) (tl : term_list) (pl0 pl1 : prec_list) (n : nat),
liste_reconnait (preDTA_produit d0 d1) (pl_produit pl0 pl1) tl ->
predta_compatible d0 d1 ->
pl_tl_length pl0 n ->
pl_tl_length pl1 n ->
(forall u : term,
term_list_occur u tl ->
forall (d0 d1 : preDTA) (a0 a1 : ad),
predta_compatible d0 d1 ->
reconnaissance (preDTA_produit d0 d1) (iad_conv a0 a1) u ->
reconnaissance d0 a0 u /\ reconnaissance d1 a1 u) ->
liste_reconnait d0 pl0 tl /\ liste_reconnait d1 pl1 tl.