let rec unlet_pred sigma bvars defs cpt = function                                               
  | Papp (f, tl) -> 
      Papp (f, List.map (fun t -> unlet_term sigma bvars defs t) tl)
  | Pimplies (p1,p2) -> 
      Pimplies(unlet_pred sigma bvars defs cpt p1,
               unlet_pred sigma bvars defs cpt p2)
  | Pif (t,p1,p2) -> 
      Pif(unlet_term sigma bvars defs t, 
          unlet_pred sigma bvars defs cpt p1, 
          unlet_pred sigma bvars defs cpt p2)
  | Pand (p1,p2) -> 
      Pand(unlet_pred sigma bvars defs cpt p1, unlet_pred sigma bvars defs cpt p2)
  | Por (p1,p2) -> 
      Por(unlet_pred sigma bvars defs cpt p1, unlet_pred sigma bvars defs cpt p2)
  | Piff (p1,p2) -> 
      Piff(unlet_pred sigma bvars defs cpt p1, unlet_pred sigma bvars defs cpt p2) 
  | Pnot p -> Pnot (unlet_pred sigma bvars defs cpt p)
  | Pforall (x,p) -> 
      let nx,nsigma = new_name x sigma cpt in 
      Pforall(nx,unlet_pred nsigma (Vset.add x bvars) defs cpt p) 
  | Pexists(x,p) -> 
      let nx,nsigma = new_name x sigma cpt in 
      Pexists(nx,unlet_pred nsigma (Vset.add x bvars) defs cpt p)
  | Plet (x,t,p) ->
      let nx,nsigma =  new_name x sigma cpt in 
      let b = Vset.add x bvars in 
      p_forall nx
        (p_implies
           (p_app "eq" [e_var nx;unlet_term sigma b defs t])
           (unlet_pred nsigma b defs cpt p))
  | Pnamed(s,p) -> Pnamed(s,unlet_pred sigma bvars defs cpt p)
  | p -> p