module Types : sig ... endAbstract domains and domain combinators
module type S : sig ... endCreate a domain with Top element from a pre-domain
module Pair : functor (Domain1 : S) -> functor (Domain2 : S) -> S with type astate = Domain1.astate * Domain2.astateCartesian product of two domains.
module FiniteSetOfPPSet : functor (PPSet : InferStdlib.PrettyPrintable.PPSet) -> sig ... endLift a PPSet to a powerset domain ordered by subset. The elements of the set should be drawn from a *finite* collection of possible values, since the widening operator here is just union.
module FiniteSet : functor (Element : InferStdlib.PrettyPrintable.PrintableOrderedType) -> sig ... endLift a set to a powerset domain ordered by subset. The elements of the set should be drawn from a *finite* collection of possible values, since the widening operator here is just union.
module InvertedSet : functor (Element : InferStdlib.PrettyPrintable.PrintableOrderedType) -> sig ... endLift a set to a powerset domain ordered by superset, so the join operator is intersection
module MapOfPPMap : functor (PPMap : InferStdlib.PrettyPrintable.PPMap) -> functor (ValueDomain : S) -> sig ... endMap domain ordered by union over the set of bindings, so the bottom element is the empty map. Every element implicitly maps to bottom unless it is explicitly bound to something else. Uses PPMap as the underlying map
module Map : functor (Key : InferStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : S) -> sig ... endMap domain ordered by union over the set of bindings, so the bottom element is the empty map. Every element implicitly maps to bottom unless it is explicitly bound to something else
module InvertedMap : functor (Key : InferStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : S) -> sig ... endMap domain ordered by intersection over the set of bindings, so the top element is the empty map. Every element implictly maps to top unless it is explicitly bound to something else
Boolean domain ordered by p || ~q. Useful when you want a boolean that's true only when it's true in both conditional branches.
include sig ... endmodule BooleanAnd : S with type astate = boolmodule BooleanOr : WithBottom with type astate = boolBoolean domain ordered by ~p || q. Useful when you want a boolean that's true only when it's true in one conditional branch.
module type MaxCount : sig ... endmodule CountDomain : functor (MaxCount : MaxCount) -> sig ... endDomain keeping a non-negative count with a bounded maximum value. The count can be only incremented and decremented
module StackDomain : functor (Element : InferStdlib.PrettyPrintable.PrintableOrderedType) -> sig ... endDomain whose members are stacks of elements (lists, last pushed is head of the list),
partially ordered by the prefix relation (c;b;a <= b;a), and whose join computes the
longest common prefix (so c;b;a join f;g;b;c;a = a), so the top element is the empty
stack.