Fixpoint codeTerm (t : Term) : nat :=
  match t with
  | fol.var n => cPair 0 n
  | fol.apply f ts => cPair (S (codeF f)) (codeTerms _ ts)
  end
 
 with codeTerms (n : nat) (ts : Terms n) {struct ts} : nat :=
  match ts with
  | Tnil => 0
  | Tcons n t ss => S (cPair (codeTerm t) (codeTerms n ss))
  end.

(* Specifications: *)
Lemma codeTermInj : forall t s : Term, codeTerm t = codeTerm s -> t = s.
Lemma codeTermsInj : forall (n : nat) (ts ss : Terms n), codeTerms n ts = codeTerms n ss -> ts = ss.