Implementation of Abstraction Functions

`type rules`````

Abstraction rules discovered

`val abstract : InferIR.Typ.Procname.t ‑> InferIR.Tenv.t ‑> InferModules.Prop.normal InferModules.Prop.t ‑> InferModules.Prop.normal InferModules.Prop.t`

Abstract a proposition.

`val abstract_junk : InferIR.Typ.Procname.t ‑> InferIR.Tenv.t ‑> InferModules.Prop.normal InferModules.Prop.t ‑> InferModules.Prop.normal InferModules.Prop.t`

Check whether the prop contains junk. If it does, and `Config.allowleak` is true, remove the junk, otherwise raise a Leak exception.

`val abstract_no_symop : InferIR.Typ.Procname.t ‑> InferIR.Tenv.t ‑> InferModules.Prop.normal InferModules.Prop.t ‑> InferModules.Prop.normal InferModules.Prop.t`

Abstract a proposition but don't pay a SymOp

`val get_current_rules : unit ‑> rules`

Get the current rules discoveres

`val lifted_abstract : InferIR.Typ.Procname.t ‑> InferIR.Tenv.t ‑> InferModules.Propset.t ‑> InferModules.Propset.t`

Abstract each proposition in `propset`

`val remove_redundant_array_elements : InferIR.Typ.Procname.t ‑> InferIR.Tenv.t ‑> InferModules.Prop.normal InferModules.Prop.t ‑> InferModules.Prop.normal InferModules.Prop.t`

Remove redundant elements in an array, and check for junk afterwards

`val reset_current_rules : unit ‑> unit`

Reset the abstraction rules discovered

`val set_current_rules : rules ‑> unit`

Set the current rules discovered