sig
  type solver
  val make_solver : string -> Smtlib.solver
  type identifier = Id of string
  type sort =
      Sort of Smtlib.identifier
    | SortApp of Smtlib.identifier * Smtlib.sort list
    | BitVecSort of int
  type term =
      String of string
    | Int of int
    | BitVec of int * int
    | Const of Smtlib.identifier
    | App of Smtlib.identifier * Smtlib.term list
    | Let of string * Smtlib.term * Smtlib.term
  type check_sat_result = Sat | Unsat | Unknown
  val declare_const :
    Smtlib.solver -> Smtlib.identifier -> Smtlib.sort -> unit
  val assert_ : Smtlib.solver -> Smtlib.term -> unit
  val check_sat : Smtlib.solver -> Smtlib.check_sat_result
  val get_model : Smtlib.solver -> (Smtlib.identifier * Smtlib.term) list
  val push : Smtlib.solver -> unit
  val pop : Smtlib.solver -> unit
  val int_sort : Smtlib.sort
  val bool_sort : Smtlib.sort
  val array_sort : Smtlib.sort -> Smtlib.sort -> Smtlib.sort
  val int_to_term : int -> Smtlib.term
  val bool_to_term : bool -> Smtlib.term
  val const : string -> Smtlib.term
  val equals : Smtlib.term -> Smtlib.term -> Smtlib.term
  val and_ : Smtlib.term -> Smtlib.term -> Smtlib.term
  val or_ : Smtlib.term -> Smtlib.term -> Smtlib.term
  val not_ : Smtlib.term -> Smtlib.term
  val ite : Smtlib.term -> Smtlib.term -> Smtlib.term -> Smtlib.term
  val implies : Smtlib.term -> Smtlib.term -> Smtlib.term
  val add : Smtlib.term -> Smtlib.term -> Smtlib.term
  val sub : Smtlib.term -> Smtlib.term -> Smtlib.term
  val mul : Smtlib.term -> Smtlib.term -> Smtlib.term
  val lt : Smtlib.term -> Smtlib.term -> Smtlib.term
  val gt : Smtlib.term -> Smtlib.term -> Smtlib.term
  val lte : Smtlib.term -> Smtlib.term -> Smtlib.term
  val gte : Smtlib.term -> Smtlib.term -> Smtlib.term
  val bv_sort : int -> Smtlib.sort
  val bv : int -> int -> Smtlib.term
  val bvadd : Smtlib.term -> Smtlib.term -> Smtlib.term
  val bvsub : Smtlib.term -> Smtlib.term -> Smtlib.term
  val bvmul : Smtlib.term -> Smtlib.term -> Smtlib.term
  val bvurem : Smtlib.term -> Smtlib.term -> Smtlib.term
  val bvsrem : Smtlib.term -> Smtlib.term -> Smtlib.term
  val bvsmod : Smtlib.term -> Smtlib.term -> Smtlib.term
  val bvshl : Smtlib.term -> Smtlib.term -> Smtlib.term
  val bvlshr : Smtlib.term -> Smtlib.term -> Smtlib.term
  val bvashr : Smtlib.term -> Smtlib.term -> Smtlib.term
  val bvor : Smtlib.term -> Smtlib.term -> Smtlib.term
  val bvand : Smtlib.term -> Smtlib.term -> Smtlib.term
  val bvnand : Smtlib.term -> Smtlib.term -> Smtlib.term
  val bvnor : Smtlib.term -> Smtlib.term -> Smtlib.term
  val bvxnor : Smtlib.term -> Smtlib.term -> Smtlib.term
  val bvneg : Smtlib.term -> Smtlib.term
  val bvnot : Smtlib.term -> Smtlib.term
  type sexp =
    Smtlib_syntax.sexp =
      SList of Smtlib.sexp list
    | SSymbol of string
    | SString of string
    | SKeyword of string
    | SInt of int
    | SBitVec of int * int
  val command : Smtlib.solver -> Smtlib.sexp -> Smtlib.sexp
  val sexp_to_string : Smtlib.sexp -> string
end