sig
  exception Divide_by_zero
  type 'a value =
      [ `Bool of bool
      | `Fun of ('a, Syntax.typ_fo) Syntax.expr
      | `Real of QQ.t ]
  type 'a interpretation
  val pp : Format.formatter -> 'Interpretation.interpretation -> unit
  val empty : 'Syntax.context -> 'Interpretation.interpretation
  val wrap :
    ?symbols:Syntax.symbol list ->
    'Syntax.context ->
    (Syntax.symbol -> 'Interpretation.value) ->
    'Interpretation.interpretation
  val add_real :
    Syntax.symbol ->
    QQ.t ->
    'Interpretation.interpretation -> 'Interpretation.interpretation
  val add_bool :
    Syntax.symbol ->
    bool ->
    'Interpretation.interpretation -> 'Interpretation.interpretation
  val add_fun :
    Syntax.symbol ->
    ('a, Syntax.typ_fo) Syntax.expr ->
    'Interpretation.interpretation -> 'Interpretation.interpretation
  val add :
    Syntax.symbol ->
    'Interpretation.value ->
    'Interpretation.interpretation -> 'Interpretation.interpretation
  val real : 'Interpretation.interpretation -> Syntax.symbol -> QQ.t
  val bool : 'Interpretation.interpretation -> Syntax.symbol -> bool
  val value :
    'Interpretation.interpretation ->
    Syntax.symbol -> 'Interpretation.value
  val enum :
    'Interpretation.interpretation ->
    (Syntax.symbol *
     [ `Bool of bool
     | `Fun of ('a, Syntax.typ_fo) Syntax.expr
     | `Real of QQ.t ])
    BatEnum.t
  val substitute :
    'Interpretation.interpretation ->
    ('a, 'typ) Syntax.expr -> ('a, 'typ) Syntax.expr
  val evaluate_term :
    'Interpretation.interpretation ->
    ?env:[ `Bool of bool | `Real of QQ.t ] Syntax.Env.t ->
    'Syntax.term -> QQ.t
  val evaluate_formula :
    'Interpretation.interpretation ->
    ?env:[ `Bool of bool | `Real of QQ.t ] Syntax.Env.t ->
    'Syntax.formula -> bool
  val get_context : 'Interpretation.interpretation -> 'Syntax.context
  val select_implicant :
    'Interpretation.interpretation ->
    ?env:[ `Bool of bool | `Real of QQ.t ] Syntax.Env.t ->
    'Syntax.formula -> 'Syntax.formula list option
  val select_ite :
    'Interpretation.interpretation ->
    ?env:[ `Bool of bool | `Real of QQ.t ] Syntax.Env.t ->
    ('a, 'b) Syntax.expr -> ('a, 'b) Syntax.expr * 'Syntax.formula list
  val destruct_atom :
    'Syntax.context ->
    'Syntax.formula ->
    [ `Comparison of [ `Eq | `Leq | `Lt ] * 'Syntax.term * 'Syntax.term
    | `Literal of [ `Neg | `Pos ] * [ `Const of Syntax.symbol | `Var of int ] ]
end