let fol p =
    let rec do_data d = match d with
      | E1addr v -> Fol.Tvar (WpFol.addr_lvar ~create:true v)
      | E1proj (o, WpFol.Pfield x) ->  WpFol.fol_field_access (fol_exp o) x
      | E1proj (o, WpFol.Pidx x) -> Why_ops.array_access  (fol_exp o) (fol_exp x)
      | E1depl (o, WpFol.Pfield x) -> WpFol.fol_field_shift (fol_exp o) x
      | E1depl (o, WpFol.Pidx x) -> Why_ops.index_shift (fol_exp o) (fol_exp x)
      | E1shift (o, x) -> Why_ops.shift_pointer (fol_exp o) (fol_exp x)
      | E1mu (o, WpFol.Pfield x, e) -> 
          WpFol.fol_field_update (fol_exp o) x (fol_exp e)
      | E1mu (o, WpFol.Pidx x, e) -> 
          Why_ops.array_update (fol_exp o) (fol_exp x) (fol_exp e)
      | E1indir e -> Why_ops.M1.pointer_access (fol_exp e)
      | E1muI (p, x) -> Why_ops.M1.pointer_update (fol_exp p) (fol_exp x)
    and fol_exp e = Fol.translate_data_in_term do_data e 
    in
      Fol.translate_data_in_pred do_data p