Module InferModules.AbstractDomain

module F = Format
module Types : sig ... end

Abstract domains and domain combinators

module type S : sig ... end
module type WithBottom : sig ... end

A domain with an explicit bottom value

module type WithTop : sig ... end

A domain with an explicit top value

module BottomLifted : functor (Domain : S) -> sig ... end

Lift a pre-domain to a domain

Create a domain with Top element from a pre-domain

include sig ... end
module TopLifted : functor (Domain : S) -> sig ... end
module Pair : functor (Domain1 : S) -> functor (Domain2 : S) -> S with type astate = Domain1.astate * Domain2.astate

Cartesian product of two domains.

module FiniteSetOfPPSet : functor (PPSet : InferStdlib.PrettyPrintable.PPSet) -> sig ... end

Lift 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 ... end

Lift 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 ... end

Lift 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 ... end

Map 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 ... end

Map 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 ... end

Map 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 ... end
module BooleanAnd : S with type astate = bool
module BooleanOr : WithBottom with type astate = bool

Boolean 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 ... end
module CountDomain : functor (MaxCount : MaxCount) -> sig ... end

Domain 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 ... end

Domain 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.