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