let rec unlet_pred sigma bvars defs cpt = function
  | Papp (f, tl) ->
      p_app 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