(* sens moins trivial : si un terme est reconnu par ... *)

Inductive reconnaissance_co : preDTA -> ad -> ad -> term -> Prop :=
    rec_co_dta :
      forall (d : preDTA) (a b : ad) (t : term) (ladj : state),
      MapGet state d a = Some ladj ->
      state_reconnait_co d ladj b t ->
      coacc d b a -> reconnaissance_co d a b t
with state_reconnait_co : preDTA -> state -> ad -> term -> Prop :=
    rec_co_st :
      forall (d : preDTA) (s : state) (c b : ad) (tl : term_list)
        (l : prec_list),
      MapGet prec_list s c = Some l ->
      liste_reconnait_co d l b tl -> state_reconnait_co d s b (app c tl)
with liste_reconnait_co : preDTA -> prec_list -> ad -> term_list -> Prop :=
  | rec_co_empty :
      forall (d : preDTA) (b : ad), liste_reconnait_co d prec_empty b tnil
  | rec_co_consi :
      forall (d : preDTA) (a : ad) (la ls : prec_list) 
        (hd : term) (b : ad) (tl : term_list),
      reconnaissance_co d a b hd ->
      liste_reconnait_co d la b tl ->
      liste_reconnait_co d (prec_cons a la ls) b (tcons hd tl)
  | rec_co_consn :
      forall (d : preDTA) (a : ad) (la ls : prec_list) 
        (hd : term) (b : ad) (tl : term_list),
      liste_reconnait_co d ls b (tcons hd tl) ->
      liste_reconnait_co d (prec_cons a la ls) b (tcons hd tl).(* sens moins trivial : si un terme est reconnu par ... *)

Inductive reconnaissance_co : preDTA -> ad -> ad -> term -> Prop :=
    rec_co_dta :
      forall (d : preDTA) (a b : ad) (t : term) (ladj : state),
      MapGet state d a = Some ladj ->
      state_reconnait_co d ladj b t ->
      coacc d b a -> reconnaissance_co d a b t
with state_reconnait_co : preDTA -> state -> ad -> term -> Prop :=
    rec_co_st :
      forall (d : preDTA) (s : state) (c b : ad) (tl : term_list)
        (l : prec_list),
      MapGet prec_list s c = Some l ->
      liste_reconnait_co d l b tl -> state_reconnait_co d s b (app c tl)
with liste_reconnait_co : preDTA -> prec_list -> ad -> term_list -> Prop :=
  | rec_co_empty :
      forall (d : preDTA) (b : ad), liste_reconnait_co d prec_empty b tnil
  | rec_co_consi :
      forall (d : preDTA) (a : ad) (la ls : prec_list) 
        (hd : term) (b : ad) (tl : term_list),
      reconnaissance_co d a b hd ->
      liste_reconnait_co d la b tl ->
      liste_reconnait_co d (prec_cons a la ls) b (tcons hd tl)
  | rec_co_consn :
      forall (d : preDTA) (a : ad) (la ls : prec_list) 
        (hd : term) (b : ad) (tl : term_list),
      liste_reconnait_co d ls b (tcons hd tl) ->
      liste_reconnait_co d (prec_cons a la ls) b (tcons hd tl).(* sens moins trivial : si un terme est reconnu par ... *)

Inductive reconnaissance_co : preDTA -> ad -> ad -> term -> Prop :=
    rec_co_dta :
      forall (d : preDTA) (a b : ad) (t : term) (ladj : state),
      MapGet state d a = Some ladj ->
      state_reconnait_co d ladj b t ->
      coacc d b a -> reconnaissance_co d a b t
with state_reconnait_co : preDTA -> state -> ad -> term -> Prop :=
    rec_co_st :
      forall (d : preDTA) (s : state) (c b : ad) (tl : term_list)
        (l : prec_list),
      MapGet prec_list s c = Some l ->
      liste_reconnait_co d l b tl -> state_reconnait_co d s b (app c tl)
with liste_reconnait_co : preDTA -> prec_list -> ad -> term_list -> Prop :=
  | rec_co_empty :
      forall (d : preDTA) (b : ad), liste_reconnait_co d prec_empty b tnil
  | rec_co_consi :
      forall (d : preDTA) (a : ad) (la ls : prec_list) 
        (hd : term) (b : ad) (tl : term_list),
      reconnaissance_co d a b hd ->
      liste_reconnait_co d la b tl ->
      liste_reconnait_co d (prec_cons a la ls) b (tcons hd tl)
  | rec_co_consn :
      forall (d : preDTA) (a : ad) (la ls : prec_list) 
        (hd : term) (b : ad) (tl : term_list),
      liste_reconnait_co d ls b (tcons hd tl) ->
      liste_reconnait_co d (prec_cons a la ls) b (tcons hd tl).(* sens moins trivial : si un terme est reconnu par ... *)

Inductive reconnaissance_co : preDTA -> ad -> ad -> term -> Prop :=
    rec_co_dta :
      forall (d : preDTA) (a b : ad) (t : term) (ladj : state),
      MapGet state d a = Some ladj ->
      state_reconnait_co d ladj b t ->
      coacc d b a -> reconnaissance_co d a b t
with state_reconnait_co : preDTA -> state -> ad -> term -> Prop :=
    rec_co_st :
      forall (d : preDTA) (s : state) (c b : ad) (tl : term_list)
        (l : prec_list),
      MapGet prec_list s c = Some l ->
      liste_reconnait_co d l b tl -> state_reconnait_co d s b (app c tl)
with liste_reconnait_co : preDTA -> prec_list -> ad -> term_list -> Prop :=
  | rec_co_empty :
      forall (d : preDTA) (b : ad), liste_reconnait_co d prec_empty b tnil
  | rec_co_consi :
      forall (d : preDTA) (a : ad) (la ls : prec_list) 
        (hd : term) (b : ad) (tl : term_list),
      reconnaissance_co d a b hd ->
      liste_reconnait_co d la b tl ->
      liste_reconnait_co d (prec_cons a la ls) b (tcons hd tl)
  | rec_co_consn :
      forall (d : preDTA) (a : ad) (la ls : prec_list) 
        (hd : term) (b : ad) (tl : term_list),
      liste_reconnait_co d ls b (tcons hd tl) ->
      liste_reconnait_co d (prec_cons a la ls) b (tcons hd tl).(* sens moins trivial : si un terme est reconnu par ... *)

Inductive reconnaissance_co : preDTA -> ad -> ad -> term -> Prop :=
    rec_co_dta :
      forall (d : preDTA) (a b : ad) (t : term) (ladj : state),
      MapGet state d a = Some ladj ->
      state_reconnait_co d ladj b t ->
      coacc d b a -> reconnaissance_co d a b t
with state_reconnait_co : preDTA -> state -> ad -> term -> Prop :=
    rec_co_st :
      forall (d : preDTA) (s : state) (c b : ad) (tl : term_list)
        (l : prec_list),
      MapGet prec_list s c = Some l ->
      liste_reconnait_co d l b tl -> state_reconnait_co d s b (app c tl)
with liste_reconnait_co : preDTA -> prec_list -> ad -> term_list -> Prop :=
  | rec_co_empty :
      forall (d : preDTA) (b : ad), liste_reconnait_co d prec_empty b tnil
  | rec_co_consi :
      forall (d : preDTA) (a : ad) (la ls : prec_list) 
        (hd : term) (b : ad) (tl : term_list),
      reconnaissance_co d a b hd ->
      liste_reconnait_co d la b tl ->
      liste_reconnait_co d (prec_cons a la ls) b (tcons hd tl)
  | rec_co_consn :
      forall (d : preDTA) (a : ad) (la ls : prec_list) 
        (hd : term) (b : ad) (tl : term_list),
      liste_reconnait_co d ls b (tcons hd tl) ->
      liste_reconnait_co d (prec_cons a la ls) b (tcons hd tl).(* sens moins trivial : si un terme est reconnu par ... *)

Inductive reconnaissance_co : preDTA -> ad -> ad -> term -> Prop :=
    rec_co_dta :
      forall (d : preDTA) (a b : ad) (t : term) (ladj : state),
      MapGet state d a = Some ladj ->
      state_reconnait_co d ladj b t ->
      coacc d b a -> reconnaissance_co d a b t
with state_reconnait_co : preDTA -> state -> ad -> term -> Prop :=
    rec_co_st :
      forall (d : preDTA) (s : state) (c b : ad) (tl : term_list)
        (l : prec_list),
      MapGet prec_list s c = Some l ->
      liste_reconnait_co d l b tl -> state_reconnait_co d s b (app c tl)
with liste_reconnait_co : preDTA -> prec_list -> ad -> term_list -> Prop :=
  | rec_co_empty :
      forall (d : preDTA) (b : ad), liste_reconnait_co d prec_empty b tnil
  | rec_co_consi :
      forall (d : preDTA) (a : ad) (la ls : prec_list) 
        (hd : term) (b : ad) (tl : term_list),
      reconnaissance_co d a b hd ->
      liste_reconnait_co d la b tl ->
      liste_reconnait_co d (prec_cons a la ls) b (tcons hd tl)
  | rec_co_consn :
      forall (d : preDTA) (a : ad) (la ls : prec_list) 
        (hd : term) (b : ad) (tl : term_list),
      liste_reconnait_co d ls b (tcons hd tl) ->
      liste_reconnait_co d (prec_cons a la ls) b (tcons hd tl).(* sens moins trivial : si un terme est reconnu par ... *)

Inductive reconnaissance_co : preDTA -> ad -> ad -> term -> Prop :=
    rec_co_dta :
      forall (d : preDTA) (a b : ad) (t : term) (ladj : state),
      MapGet state d a = Some ladj ->
      state_reconnait_co d ladj b t ->
      coacc d b a -> reconnaissance_co d a b t
with state_reconnait_co : preDTA -> state -> ad -> term -> Prop :=
    rec_co_st :
      forall (d : preDTA) (s : state) (c b : ad) (tl : term_list)
        (l : prec_list),
      MapGet prec_list s c = Some l ->
      liste_reconnait_co d l b tl -> state_reconnait_co d s b (app c tl)
with liste_reconnait_co : preDTA -> prec_list -> ad -> term_list -> Prop :=
  | rec_co_empty :
      forall (d : preDTA) (b : ad), liste_reconnait_co d prec_empty b tnil
  | rec_co_consi :
      forall (d : preDTA) (a : ad) (la ls : prec_list) 
        (hd : term) (b : ad) (tl : term_list),
      reconnaissance_co d a b hd ->
      liste_reconnait_co d la b tl ->
      liste_reconnait_co d (prec_cons a la ls) b (tcons hd tl)
  | rec_co_consn :
      forall (d : preDTA) (a : ad) (la ls : prec_list) 
        (hd : term) (b : ad) (tl : term_list),
      liste_reconnait_co d ls b (tcons hd tl) ->
      liste_reconnait_co d (prec_cons a la ls) b (tcons hd tl).(* sens moins trivial : si un terme est reconnu par ... *)

Inductive reconnaissance_co : preDTA -> ad -> ad -> term -> Prop :=
    rec_co_dta :
      forall (d : preDTA) (a b : ad) (t : term) (ladj : state),
      MapGet state d a = Some ladj ->
      state_reconnait_co d ladj b t ->
      coacc d b a -> reconnaissance_co d a b t
with state_reconnait_co : preDTA -> state -> ad -> term -> Prop :=
    rec_co_st :
      forall (d : preDTA) (s : state) (c b : ad) (tl : term_list)
        (l : prec_list),
      MapGet prec_list s c = Some l ->
      liste_reconnait_co d l b tl -> state_reconnait_co d s b (app c tl)
with liste_reconnait_co : preDTA -> prec_list -> ad -> term_list -> Prop :=
  | rec_co_empty :
      forall (d : preDTA) (b : ad), liste_reconnait_co d prec_empty b tnil
  | rec_co_consi :
      forall (d : preDTA) (a : ad) (la ls : prec_list) 
        (hd : term) (b : ad) (tl : term_list),
      reconnaissance_co d a b hd ->
      liste_reconnait_co d la b tl ->
      liste_reconnait_co d (prec_cons a la ls) b (tcons hd tl)
  | rec_co_consn :
      forall (d : preDTA) (a : ad) (la ls : prec_list) 
        (hd : term) (b : ad) (tl : term_list),
      liste_reconnait_co d ls b (tcons hd tl) ->
      liste_reconnait_co d (prec_cons a la ls) b (tcons hd tl).Scheme mreconnaissance_co_ind := Induction for reconnaissance_co
  Sort Prop
  with mstrec_co_ind := Induction for state_reconnait_co
  Sort Prop
  with mlrec_co_ind := Induction for liste_reconnait_co 
  Sort Prop.Definition rec_co_def_0 (d : preDTA) (a a1 : ad) (t : term)
  (pr : reconnaissance_co d a a1 t) :=
  forall a0 : ad, coacc d a0 a1 -> reconnaissance_co d a a0 t.Definition rec_co_def_1 (d : preDTA) (s : state) (a1 : ad) 
  (t : term) (pr : state_reconnait_co d s a1 t) :=
  forall a0 : ad, coacc d a0 a1 -> state_reconnait_co d s a0 t.Definition rec_co_def_2 (d : preDTA) (p : prec_list) 
  (a1 : ad) (tl : term_list) (pr : liste_reconnait_co d p a1 tl) :=
  forall a0 : ad, coacc d a0 a1 -> liste_reconnait_co d p a0 tl.

Lemma rec_co_0 : forall (d : preDTA) (a b : ad) (t : term) (ladj : state) (e : MapGet state d a = Some ladj) (s : state_reconnait_co d ladj b t), rec_co_def_1 d ladj b t s -> forall c : coacc d b a, rec_co_def_0 d a b t (rec_co_dta d a b t ladj e s c).