`type raw``= t```
`type t````=`

`|` `Abstracted of raw` | (** abstraction of heap reachable from an access path, e.g. x.f* *)
`|` `Exact of raw` | (** precise representation of an access path, e.g. x.f.g *)

``
`include sig ... end`
`val compare : t ‑> t ‑> int`
`val equal : t ‑> t ‑> bool`
`val to_footprint : int ‑> t ‑> t`

replace the base var with a footprint variable rooted at formal index `formal_index`

`val get_footprint_index_base : base ‑> int option`

return the formal index associated with the base of this access path if there is one, or None otherwise

`val with_base : base ‑> t ‑> t`

swap base of existing access path for `base_var` (e.g., `with_base_bvar x y.f.g` produces `x.f.g`

`val extract : t ‑> raw`

extract a raw access path from its wrapper

`val is_exact : t ‑> bool`

return true if `t` is an exact representation of an access path, false if it's an abstraction

`val (<=) : lhs:t ‑> rhs:t ‑> bool`

return true if \gamma(lhs) \subseteq \gamma(rhs)

`val pp : Format.formatter ‑> t ‑> unit`