Remark mapListLemma :
 forall l : list nat, fold_right max 0 (map S l) <= S (fold_right max 0 l).Remark boundSubFormulaHelp2 :
 forall (a : fol.Formula L) (v0 : nat) (s : fol.Term L),
 newVar (v0 :: freeVarTerm L s ++ freeVarFormula L a) <=
 S
   (fold_right max 0
      (v0 :: fold_right max 0 (freeVarTerm L s) :: varFormula a)).Remark boundSubFormulaHelp1 :
 forall (b a : fol.Formula L) (v0 v : nat) (s : fol.Term L),
 fold_right max 0
   (varFormula
      (substituteFormula L b v
         (fol.var L (newVar (v0 :: freeVarTerm L s ++ freeVarFormula L a))))) <=
 pow3 (depth L b) + pow3 (depth L b) +
 max v0
   (max (fold_right max 0 (freeVarTerm L s))
      (max v
         (max (fold_right max 0 (varFormula b))
            (fold_right max 0 (varFormula a))))).Remark boundSubFormulaHelp :
 forall (f : fol.Formula L) (v : nat) (s : fol.Term L),
 codeFormula (substituteFormula L f v s) <=
 ReplaceFormulaTerm (codeFormula f)
   (max (codeTerm s)
      (pow3 (depth L f) +
       fold_right max 0 (v :: freeVarTerm L s ++ varFormula f))).Definition boundComputation (d p1 p2 : nat) : nat :=
  nat_rec (fun _ => nat) (cTriple p1 p2 0)
    (fun _ rec : nat => cTriple p1 p2 (cPair rec rec)) d.

(* Specifications: *)
Lemma boundComputationIsPR : isPR 3 boundComputation.
Lemma boundComputationMonotone : forall a1 a2 b1 b2 c1 c2 : nat, a1 <= a2 -> b1 <= b2 -> c1 <= c2 -> boundComputation a1 b1 c1 <= boundComputation a2 b2 c2.
Lemma boundMakeTrace : forall (f : fol.Formula L) (v : nat) (s : fol.Term L), let C := max (codeTerm s) (cPair 0 (pow3 (depth L f) + fold_right max 0 (v :: freeVarTerm L s ++ varFormula f))) in makeTrace f (v, s) <= boundComputation (depth L f) (cTriple C C (ReplaceFormulaTerm (codeFormula f) C)) (ReplaceFormulaTerm (codeFormula f) C).