(* définition des états *)

Definition state := Map prec_list.(* définition des automates *)

Definition preDTA := Map state.Inductive DTA : Set :=
    dta : preDTA -> ad -> DTA.Inductive DTA : Set :=
    dta : preDTA -> ad -> DTA.(* calcul de la taille de l'automate : *)

Fixpoint taille_0 (l : prec_list) : nat :=
  match l with
  | prec_empty => 0
  | prec_cons x y z => S (taille_0 y + taille_0 z)
  end.Fixpoint taille_1 (s : state) : nat :=
  match s with
  | M0 => 0
  | M1 x y => taille_0 y
  | M2 x y => max (taille_1 x) (taille_1 y)
  end.Fixpoint DTA_taille (d : preDTA) : nat :=
  match d with
  | M0 => 0
  | M1 x y => taille_1 y
  | M2 x y => max (DTA_taille x) (DTA_taille y)
  end.

(* Specifications: *)
Lemma taille_aux_0 : forall (a : ad) (la ls : prec_list), S (taille_0 la) <= taille_0 (prec_cons a la ls).
Lemma taille_aux_1 : forall (a : ad) (la ls : prec_list), 1 <= taille_0 (prec_cons a la ls).
Lemma taille_aux_2 : forall (a : ad) (la ls : prec_list), S (taille_0 ls) <= taille_0 (prec_cons a la ls).