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