let let_pred prop_in_data ~fresh v e p =
if p = Ptrue then Ptrue
else begin
match e with
| Tconst _ | Tvar _ -> subst_in_pred prop_in_data v e p
| _ ->
let nb_occ = nb_var_in_pred prop_in_data v p in
(* TODOopt : do only one visit *)
if nb_occ = 0 then p
(* else if nb_occ = 1 then subst_in_pred prop_in_data v e p *)
else
let v, p =
if fresh then
let v' = fresh_var v in
let p = subst_in_pred prop_in_data v (Tvar v') p in
v', p
else
v, p
in Plet(v,e,p)
end