sig
  type t
  val neg : Proposition.t -> Indexes.t -> Literal.t
  val pos : Proposition.t -> Indexes.t -> Literal.t
  val atom_of : Literal.t -> Proposition.t * Indexes.t
  val prop_of : Literal.t -> Proposition.t
  val idx_of : Literal.t -> Indexes.t
  val is_pos : Literal.t -> bool
  val is_neg : Literal.t -> bool
  val to_string : Literal.t -> string
  val compare : Literal.t -> Literal.t -> int
  val equal : Literal.t -> Literal.t -> bool
  val compute_lit : Literal.t -> int -> Literal.t
  type variable = Variable.t
  type term = Indexes.t
  type substituable = t
  val substitute : substituable -> var:variable -> by:term -> substituable
  module PropSubs :
    sig
      type variable = Proposition.t
      type term = Proposition.t
      type substituable = t
      val substitute :
        substituable -> var:variable -> by:term -> substituable
    end
  module LoopingMap :
    sig
      type loopable = t
      type 'a t
      val empty : 'a t
      val add : 'a t -> key:loopable -> data:'-> 'a t
      val find : 'a t -> key:loopable -> 'a option
    end
  module ClosureSet :
    sig
      type t
      val empty : cstr:Constraint.t -> Literal.ClosureSet.t
      val add :
        Literal.ClosureSet.t -> key:substituable -> Literal.ClosureSet.t
      val closure_applies : Literal.ClosureSet.t -> key:substituable -> bool
      val add_constraint :
        Literal.ClosureSet.t -> cstr:Constraint.t -> Literal.ClosureSet.t
    end
  val opposite : Literal.t -> Literal.t
end