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