sig
  module Solver :
    sig
      type 'a t
      val add : 'Smt.Solver.t -> 'Syntax.formula list -> unit
      val push : 'Smt.Solver.t -> unit
      val pop : 'Smt.Solver.t -> int -> unit
      val reset : 'Smt.Solver.t -> unit
      val check :
        'Smt.Solver.t ->
        'Syntax.formula list -> [ `Sat | `Unknown | `Unsat ]
      val to_string : 'Smt.Solver.t -> string
      val get_model :
        ?symbols:Syntax.symbol list ->
        'Smt.Solver.t ->
        [ `Sat of 'Interpretation.interpretation | `Unknown | `Unsat ]
      val get_concrete_model :
        'Smt.Solver.t ->
        Syntax.symbol list ->
        [ `Sat of 'Interpretation.interpretation | `Unknown | `Unsat ]
      val get_unsat_core :
        'Smt.Solver.t ->
        'Syntax.formula list ->
        [ `Sat | `Unknown | `Unsat of 'Syntax.formula list ]
    end
  val mk_solver : ?theory:string -> 'Syntax.context -> 'Smt.Solver.t
  val get_model :
    ?symbols:Syntax.symbol list ->
    'Syntax.context ->
    'Syntax.formula ->
    [ `Sat of 'Interpretation.interpretation | `Unknown | `Unsat ]
  val get_concrete_model :
    'Syntax.context ->
    Syntax.symbol list ->
    'Syntax.formula ->
    [ `Sat of 'Interpretation.interpretation | `Unknown | `Unsat ]
  val is_sat :
    'Syntax.context -> 'Syntax.formula -> [ `Sat | `Unknown | `Unsat ]
  val entails :
    'Syntax.context ->
    'Syntax.formula -> 'Syntax.formula -> [ `No | `Unknown | `Yes ]
  val equiv :
    'Syntax.context ->
    'Syntax.formula -> 'Syntax.formula -> [ `No | `Unknown | `Yes ]
  val affine_interpretation :
    'Syntax.context ->
    'Interpretation.interpretation ->
    'Syntax.formula ->
    [ `Sat of 'Interpretation.interpretation | `Unknown | `Unsat ]
end