(* 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 ?) *)

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))).