sig
  type location = Errormsg.location
  type var = string
  type exp =
      Int of Int32.t
    | UnOp of Logic.unop * Logic.exp
    | BinOp of Logic.binop * Logic.exp * Logic.exp
    | Fun of string * Logic.exp list
    | Var of int
    | NVar of Logic.var
    | UVar of int
  and unop = Mod32 | BNot | RepS32 | RepU32
  and binop =
      Plus
    | Minus
    | Times
    | Add
    | Sub
    | Mult
    | Div
    | BAnd
    | BOr
    | BXor
    | Sll
    | Srl
    | Sra
    | SetEq
    | SetNe
    | SetGt
    | SetGe
    | SetLt
    | SetLe
    | SetAb
    | SetAe
    | SetBl
    | SetBe
    | SetPe
    | SetPo
    | SignExt
  type pred =
      Bool of bool
    | PNez of Logic.exp
    | PFun of string * Logic.exp list
    | And of Logic.pred list
    | Or of Logic.pred list
    | Imply of Logic.pred * Logic.pred
    | All of string * Logic.pred
    | Exist of string * Logic.pred
  exception CannotNegate of Logic.pred
  val negateExp : Logic.exp -> Logic.exp
  val negatePredRaise : Logic.pred -> Logic.pred
  val negatePred : Logic.pred -> Logic.pred
  val integer : int -> Logic.exp
  exception IntegerTooLarge
  val to_int : int32 -> int
  val newVar : string -> Logic.var
  val resetVars : unit -> unit
  val varName : string -> string
  val isAtomPred : Logic.pred -> bool
  val zero : Logic.exp
  val one : Logic.exp
  val minus : Logic.exp -> Logic.exp -> Logic.exp
  val plus : Logic.exp -> Logic.exp -> Logic.exp
  val times : Logic.exp -> Logic.exp -> Logic.exp
  val eq : Logic.exp -> Logic.exp -> Logic.pred
  val ne : Logic.exp -> Logic.exp -> Logic.pred
  val geq : Logic.exp -> Logic.exp -> Logic.pred
  val leq : Logic.exp -> Logic.exp -> Logic.pred
  val gt : Logic.exp -> Logic.exp -> Logic.pred
  val lt : Logic.exp -> Logic.exp -> Logic.pred
  val makeMap : (int * Logic.exp) list -> Logic.exp
  val findMap : Logic.exp -> int -> Logic.exp
  val insertMap : Logic.exp -> int -> Logic.exp -> Logic.exp
  val substPred :
    ?depth:int ->
    (int -> Logic.exp -> Logic.exp option) -> Logic.pred -> Logic.pred
  val substExp :
    ?depth:int ->
    (int -> Logic.exp -> Logic.exp option) -> Logic.exp -> Logic.exp
  type soption = Unif | Done of Logic.sexp
  and subst = Logic.soption array
  and sexp = Logic.exp * Logic.subst
  and spred = Logic.pred * Logic.subst
  val eunify :
    (Logic.subst -> int -> Logic.sexp -> bool) ->
    Logic.exp * Logic.subst -> Logic.exp * Logic.subst -> bool
  val punify :
    (Logic.subst -> int -> Logic.sexp -> bool) ->
    Logic.pred * Logic.subst -> Logic.pred * Logic.subst -> bool
  val unrollUVars : Logic.subst -> Logic.exp -> Logic.exp
  val unrollUVarsRaise : Logic.subst -> Logic.exp -> Logic.exp
  val unrollUVarsPredRaise : Logic.subst -> Logic.pred -> Logic.pred
  val unrollExp : Logic.sexp -> Logic.sexp
  exception HasUVar
  val unrollUVarsError : Logic.subst -> Logic.exp -> Logic.exp
  val newSubst : int -> Logic.subst
  val emptySubst : Logic.subst
  val newSubstFromList : Logic.exp list -> Logic.subst
  val d_sexp : unit -> Logic.sexp -> Pretty.doc
  val d_spred : unit -> Logic.spred -> Pretty.doc
  val d_subst : unit -> Logic.subst -> Pretty.doc
  val d_sexpNoUnroll : unit -> Logic.sexp -> Pretty.doc
  val simplifyArith : Logic.exp -> int option
  type 'a visitAction =
      SkipChildren
    | DoChildren
    | ChangeTo of 'a
    | ChangeDoChildrenPost of 'a * ('-> 'a)
  class type logicVisitor =
    object
      method vexp : Logic.exp -> Logic.exp Logic.visitAction
      method vpred : Logic.pred -> Logic.pred Logic.visitAction
    end
  class nopLogicVisitor : logicVisitor
  val visitLogicExp : Logic.logicVisitor -> Logic.exp -> Logic.exp
  val visitLogicPred : Logic.logicVisitor -> Logic.pred -> Logic.pred
  val unop_to_string : Logic.unop -> string
  val binop_to_string : Logic.binop -> string
  class type logicPrinter =
    object
      method pExp : Logic.exp -> Pretty.doc option
      method pPred : Logic.pred -> Pretty.doc option
    end
  class defaultLogicPrinterClass : logicPrinter
  val defaultLogicPrinter : Logic.logicPrinter
  class infixLogicPrinterClass : logicPrinter
  val infixLogicPrinter : Logic.logicPrinter
  val printExp : Logic.logicPrinter -> Logic.exp -> Pretty.doc
  val printPred : Logic.logicPrinter -> Logic.pred -> Pretty.doc
  val d_pred : unit -> Logic.pred -> Pretty.doc
  val d_exp : unit -> Logic.exp -> Pretty.doc
  val d_explist : unit -> Logic.exp list -> Pretty.doc
  val d_loc : unit -> Logic.location -> Pretty.doc
  class uvarLogicPrinterClass : Logic.subst -> logicPrinter
  val renameVariable : Logic.pred -> string -> string -> Logic.pred
end