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