Overapproximation of number of locks that are currently held

`include InferModules.AbstractDomain.WithBottom`
`include InferModules.AbstractDomain.S`
`type astate`````
`val (<=) : lhs:astate ‑> rhs:astate ‑> bool`

the partial order induced by join

`val join : astate ‑> astate ‑> astate`
`val widen : prev:astate ‑> next:astate ‑> num_iters:int ‑> astate`
`val pp : InferModules.AbstractDomain.F.formatter ‑> astate ‑> unit`
`val empty : astate`

The bottom value of the domain. Naming it empty instead of bottom helps to bind the empty value for sets and maps to the natural definition for bottom

`val is_empty : astate ‑> bool`

Return true if this is the bottom value

`val acquire_lock : astate ‑> astate`

record acquisition of a lock

`val release_lock : astate ‑> astate`

record release of a lock

`val integrate_summary : caller_astate:astate ‑> callee_astate:astate ‑> astate`

integrate current state with a callee summary