sig
  type var_name = string
  type var_type = Float | Int | Bool
  type value = F of float | I of int | B of bool
  type bool_expr
  val make_bool_expr :
    (LuckyDraw.var_name * LuckyDraw.var_type) list ->
    string -> LuckyDraw.bool_expr
  val and_b :
    LuckyDraw.bool_expr -> LuckyDraw.bool_expr -> LuckyDraw.bool_expr
  val or_b :
    LuckyDraw.bool_expr -> LuckyDraw.bool_expr -> LuckyDraw.bool_expr
  val xor_b :
    LuckyDraw.bool_expr -> LuckyDraw.bool_expr -> LuckyDraw.bool_expr
  val impl_b :
    LuckyDraw.bool_expr -> LuckyDraw.bool_expr -> LuckyDraw.bool_expr
  val eq_b :
    LuckyDraw.bool_expr -> LuckyDraw.bool_expr -> LuckyDraw.bool_expr
  val not_b : LuckyDraw.bool_expr -> LuckyDraw.bool_expr
  val true_b : LuckyDraw.bool_expr
  val false_b : LuckyDraw.bool_expr
  val ite_b :
    LuckyDraw.bool_expr ->
    LuckyDraw.bool_expr -> LuckyDraw.bool_expr -> LuckyDraw.bool_expr
  val var_b : string -> LuckyDraw.bool_expr
  type int_expr
  val var_i : string -> LuckyDraw.int_expr
  val val_i : int -> LuckyDraw.int_expr
  val eq_i : LuckyDraw.int_expr -> LuckyDraw.int_expr -> LuckyDraw.bool_expr
  val sup_i : LuckyDraw.int_expr -> LuckyDraw.int_expr -> LuckyDraw.bool_expr
  val supeq_i :
    LuckyDraw.int_expr -> LuckyDraw.int_expr -> LuckyDraw.bool_expr
  val inf_i : LuckyDraw.int_expr -> LuckyDraw.int_expr -> LuckyDraw.bool_expr
  val infeq_i :
    LuckyDraw.int_expr -> LuckyDraw.int_expr -> LuckyDraw.bool_expr
  val ite_i :
    LuckyDraw.bool_expr ->
    LuckyDraw.int_expr -> LuckyDraw.int_expr -> LuckyDraw.int_expr
  val sum_i : LuckyDraw.int_expr -> LuckyDraw.int_expr -> LuckyDraw.int_expr
  val diff_i : LuckyDraw.int_expr -> LuckyDraw.int_expr -> LuckyDraw.int_expr
  val prod_i : LuckyDraw.int_expr -> LuckyDraw.int_expr -> LuckyDraw.int_expr
  val quot_i : LuckyDraw.int_expr -> LuckyDraw.int_expr -> LuckyDraw.int_expr
  val mod_i : LuckyDraw.int_expr -> LuckyDraw.int_expr -> LuckyDraw.int_expr
  val div_i : LuckyDraw.int_expr -> LuckyDraw.int_expr -> LuckyDraw.int_expr
  val uminus_i : LuckyDraw.int_expr -> LuckyDraw.int_expr
  type float_expr
  val var_f : string -> LuckyDraw.float_expr
  val val_f : float -> LuckyDraw.float_expr
  val eq_f :
    LuckyDraw.float_expr -> LuckyDraw.float_expr -> LuckyDraw.bool_expr
  val sup_f :
    LuckyDraw.float_expr -> LuckyDraw.float_expr -> LuckyDraw.bool_expr
  val supeq_f :
    LuckyDraw.float_expr -> LuckyDraw.float_expr -> LuckyDraw.bool_expr
  val inf_f :
    LuckyDraw.float_expr -> LuckyDraw.float_expr -> LuckyDraw.bool_expr
  val infeq_f :
    LuckyDraw.float_expr -> LuckyDraw.float_expr -> LuckyDraw.bool_expr
  val ite_f :
    LuckyDraw.bool_expr ->
    LuckyDraw.float_expr -> LuckyDraw.float_expr -> LuckyDraw.float_expr
  val sum_f :
    LuckyDraw.float_expr -> LuckyDraw.float_expr -> LuckyDraw.float_expr
  val diff_f :
    LuckyDraw.float_expr -> LuckyDraw.float_expr -> LuckyDraw.float_expr
  val prod_f :
    LuckyDraw.float_expr -> LuckyDraw.float_expr -> LuckyDraw.float_expr
  val quot_f :
    LuckyDraw.float_expr -> LuckyDraw.float_expr -> LuckyDraw.float_expr
  val uminus_f : LuckyDraw.float_expr -> LuckyDraw.float_expr
  type subst = LuckyDraw.var_name * LuckyDraw.value
  type solution = LuckyDraw.subst list
  type solutions_set
  val solve : LuckyDraw.bool_expr -> LuckyDraw.solutions_set
  type draw_mode = int * int * int
  val draw :
    ?mode:LuckyDraw.draw_mode ->
    ?verbose:int -> LuckyDraw.solutions_set -> LuckyDraw.solution list
  val set_efficient_mode : unit -> unit
  val set_fair_mode : unit -> unit
  val string_of_value : LuckyDraw.value -> string
  val bool_expr_to_string : LuckyDraw.bool_expr -> string
  val print_solution : LuckyDraw.solution -> unit
  val set_seed : int -> unit
  val set_default_max_int : int -> unit
  val set_default_min_int : int -> unit
  val set_default_max_float : float -> unit
  val set_default_min_float : float -> unit
end