let fol p =
    let rec do_data d = match d with
      | E0addr v -> Fol.Tvar (WpFol.addr_lvar ~create:true v)
      | E0proj (o, WpFol.Pfield x) ->  WpFol.fol_field_access (fol_exp o) x
      | E0proj (o, WpFol.Pidx x) -> 
          Why_ops.array_access (fol_exp o) (fol_exp x)
      | E0depl (o, WpFol.Pfield x) -> WpFol.fol_field_shift (fol_exp o) x
      | E0depl (o, WpFol.Pidx x) -> Why_ops.index_shift (fol_exp o) (fol_exp x)
      | E0shift (o, x) -> Why_ops.shift_pointer (fol_exp o) (fol_exp x)
      | E0mu (o, WpFol.Pfield x, e) -> 
          WpFol.fol_field_update (fol_exp o) x (fol_exp e)
      | E0mu (o, WpFol.Pidx x, e) -> 
          Why_ops.array_update (fol_exp o) (fol_exp x) (fol_exp e)
    and fol_exp e = Fol.translate_data_in_term do_data e 
    in
      Fol.translate_data_in_pred do_data p