(* Right-hand side of a rule *)
Definition rhs_of_rule (r : rule) : term :=
match r with rule_intro _ _ t => t end.
(* Injecte les membres gauches des règles dans les term *)
Definition lhs_of_rule (r : rule) : term :=
match r with rule_intro f lp _ => fapply f (map term_from_pattern lp) end.
Definition max_rhs (prog : list rule) : nat :=
maxl (map term_size (map rhs_of_rule prog)).
(* This lemma corresponds to the first four lines of the proof of Proposition 4. *)
(* Une règle bien formée contient uniquement des variables qui sont dans les motifs.  Soit un arbre de preuve bien formé et un programme. Pour chaque activation, montrons que |rs| ≤ activation_bound p Pour ça, calculons la taille de rs. |rs| ≤ |r| (1+ plus grand substitut d’une variable) car |rs| contient au plus |r| variables. (Lemme pour prouver ça) par ailleurs « plus grand substitut d’une variable » ≤ |t| pour toutes les variables de r car : le programme est bien formé, donc les variables de r apparaissent dans les motifs, donc la substitution les fait correspondre à des sous-termes de t (lemme : un sous-terme a une taille inférieure ?) *)

(* Specifications: *)
Lemma compatible_sizes: forall v, term_size (term_from_value v) = value_size v.
Definition max_size_image_subst (t : term) (s : variable -> value) : nat :=
maxl (map value_size (map s (vars_of_term t))).
Lemma incl_le_max_size_image_subst :
forall s t u,
incl (vars_of_term t) (vars_of_term u) -> max_size_image_subst t s <= max_size_image_subst u s.
Lemma step_one: forall s t, term_size (subst s t) <= term_size t * (1 + max_size_image_subst t s).
(* |r| ≤ |t|  t match le motif, donc pour toute variable v du motif, |v sigma| ≤ |t| soit R la taille maximale d’une image de variable par la substitution donc |v sigma| ≤ R ≤ |t|  toute variable de r est une variable du motif donc de taille ≤ |t| |rsig| ≤ |r|(R+1) d’après (1) |r| ≤ max_rhs par définition |rsig| ≤ max_rhs(R+1)  |rsig| ≤ activ(|t|) pour activ = x → max_rhs(x+1) *)
(* |xσ| ≤ |pσ| pour x ∈ p *)
Lemma size_subst_var_le_size_value:
forall p s (x:variable) v, v = psubst s p -> In x (vars_of_pattern p) -> value_size (s x) <= value_size v.
Lemma max_size_image_subst_bounded :
forall t s, max_size_image_subst t s <= term_size (subst s t).