(** * Arities

  - [arities e] returns the arities (i.e., the number of normal and safe variables)
    of the expression [e] if it is well formed, or an error including the arities of the subterms.
*)

Inductive Arities : Set :=
| error_rec : Arities -> Arities -> Arities -> Arities
| error_comp : Arities -> list Arities -> list Arities -> Arities
| error_proj : nat -> nat -> nat -> Arities
| ok_arities : nat -> nat -> Arities.(** * Arities

  - [arities e] returns the arities (i.e., the number of normal and safe variables)
    of the expression [e] if it is well formed, or an error including the arities of the subterms.
*)

Inductive Arities : Set :=
| error_rec : Arities -> Arities -> Arities -> Arities
| error_comp : Arities -> list Arities -> list Arities -> Arities
| error_proj : nat -> nat -> nat -> Arities
| ok_arities : nat -> nat -> Arities.(** * Arities

  - [arities e] returns the arities (i.e., the number of normal and safe variables)
    of the expression [e] if it is well formed, or an error including the arities of the subterms.
*)

Inductive Arities : Set :=
| error_rec : Arities -> Arities -> Arities -> Arities
| error_comp : Arities -> list Arities -> list Arities -> Arities
| error_proj : nat -> nat -> nat -> Arities
| ok_arities : nat -> nat -> Arities.(** * Arities

  - [arities e] returns the arities (i.e., the number of normal and safe variables)
    of the expression [e] if it is well formed, or an error including the arities of the subterms.
*)

Inductive Arities : Set :=
| error_rec : Arities -> Arities -> Arities -> Arities
| error_comp : Arities -> list Arities -> list Arities -> Arities
| error_proj : nat -> nat -> nat -> Arities
| ok_arities : nat -> nat -> Arities.(** * Arities

  - [arities e] returns the arities (i.e., the number of normal and safe variables)
    of the expression [e] if it is well formed, or an error including the arities of the subterms.
*)

Inductive Arities : Set :=
| error_rec : Arities -> Arities -> Arities -> Arities
| error_comp : Arities -> list Arities -> list Arities -> Arities
| error_proj : nat -> nat -> nat -> Arities
| ok_arities : nat -> nat -> Arities.Definition aeq (x y:Arities) : bool :=
  match x, y with
  | ok_arities xn xs, ok_arities yn ys => beq_nat xn yn && beq_nat xs ys
  | _, _ => false
  end.

(* Specifications: *)
Lemma aeq_eq (x y : Arities) : aeq x y = true -> x = y.
Lemma aeq_eq_conv xn yn xs ys : aeq (ok_arities xn xs) (ok_arities yn ys) = false -> xn <> yn \/ xs <> ys.