functor (Domain : Domain) (Param : Param->
  sig
    type loop = Param.loop
    type state = Domain.t
    type store
    type propagation
    type shadow
    type widening
    val empty_store : stmt:Cil_types.stmt option -> store
    val empty_propagation : unit -> propagation
    val empty_shadow : unit -> shadow
    val empty_widening : stmt:Cil_types.stmt option -> widening
    val initial_propagation : state list -> propagation
    val pretty_store : Format.formatter -> store -> unit
    val pretty_propagation : Format.formatter -> propagation -> unit
    val expanded : store -> state list
    val smashed : store -> state Bottom.Type.or_bottom
    val is_empty_store : store -> bool
    val is_empty_propagation : propagation -> bool
    val is_empty_shadow : shadow -> bool
    val store_size : store -> int
    val propagation_size : propagation -> int
    val reset_store : store -> unit
    val reset_propagation : propagation -> unit
    val reset_shadow : shadow -> unit
    val reset_widening : widening -> unit
    val enter_loop : propagation -> loop -> unit
    val leave_loop : propagation -> loop -> unit
    val next_loop_iteration : propagation -> loop -> unit
    val clear_propagation : propagation -> unit
    val transfer : (state list -> state list) -> propagation -> unit
    val merge : into:propagation -> propagation -> unit
    val join : (propagation * shadow) list -> store -> propagation
    val widen : store -> widening -> propagation -> bool
  end