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