let let_pred ~fresh v e p =
if p = Ptrue then Ptrue
else begin
match e with
| Tconst _ | Tvar _ -> subst_in_pred 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 *)
if fresh then
let v' = Var.fresh_var v in
let p = subst_in_pred v (e_var v') p in
p_let v' e p
else p_let v e p
end