Store.MakeFunctor that builds an non-relational abstract domain for stores, given implementations for keys, maps of keys, and abstract values that should be associated to keys.
module Key : sig ... endmodule _ : sig ... endmodule X : Sigs.ABSTRACT_DOMAINinclude S with type key = Key.t and type value = X.tinclude Sigs.ABSTRACT_DOMAINval bot : tThe bottom element \bot (most precise element)
val is_bot : t -> boolTests whether an element is \bot
val top : tThe top element \top (less precise element)
Inclusion test between abstract values. Smaller elements are more precise; larger elements are less precise. This might not be a total order, and might not be anti-symmetric either.
Abstract union of abstract values. This need not be the least upper bound for leq, nor an upper bound at all.
Widening operator, i.e., an approximation of the concrete union, that is used the ensure the convergence of Kleene-based iterations.
Abstract intersection of abstract values. This need not be the greatest lower bound for leq, nor a lower bound at all.
val pp : Stdlib.Format.formatter -> t -> unitPretty-printer for abstract values
type key = Key.ttype value = X.tval empty : tAbstract value that represents the empty store
Adds or replaces the entry of a key in a store. If an entry was present for that key, the new entry is the join of the former value and the provided value.
val is_top : t -> bool