let rec check_pred m p =
  if m < 0 then raise Huge ;
  match p with
    | Ptrue | Pfalse -> pred m
    | Papp(_,ts) -> List.fold_left check_term (pred m) ts
    | Pimplies(a,b) | Pand(a,b) | Por(a,b) | Piff(a,b) -> check_pred (check_pred (pred m) a) b
    | Pnamed(_,p) | Pnot p | Pforall(_,p) | Pexists(_,p) -> check_pred (pred m) p
    | Pif(a,p,q) -> check_pred (check_pred (check_term (pred m) a) p) q
    | Plet(_,t,p) -> check_pred (check_term (pred m) t) p