sig
  exception Type_mismatch
  type expr = private Term.t
  type 'a bound_or_fixed = Bound of '| Fixed of '| Unbound of 'a
  val type_of_expr : LustreExpr.expr -> Type.t
  val equal_expr : LustreExpr.expr -> LustreExpr.expr -> bool
  val is_true_expr : LustreExpr.expr -> bool
  type t = private {
    expr_init : LustreExpr.expr;
    expr_step : LustreExpr.expr;
    expr_type : Type.t;
  }
  module LustreExprHashtbl :
    sig
      type key = t
      type 'a t
      val create : int -> 'a t
      val clear : 'a t -> unit
      val reset : 'a t -> unit
      val copy : 'a t -> 'a t
      val add : 'a t -> key -> '-> unit
      val remove : 'a t -> key -> unit
      val find : 'a t -> key -> 'a
      val find_all : 'a t -> key -> 'a list
      val replace : 'a t -> key -> '-> unit
      val mem : 'a t -> key -> bool
      val iter : (key -> '-> unit) -> 'a t -> unit
      val filter_map_inplace : (key -> '-> 'a option) -> 'a t -> unit
      val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
      val length : 'a t -> int
      val stats : 'a t -> Hashtbl.statistics
    end
  val compare : LustreExpr.t -> LustreExpr.t -> int
  val compare_expr : LustreExpr.expr -> LustreExpr.expr -> int
  val equal : LustreExpr.t -> LustreExpr.t -> bool
  val hash : LustreExpr.t -> int
  val map :
    (int -> LustreExpr.t -> LustreExpr.t) -> LustreExpr.t -> LustreExpr.t
  val map_vars_expr : (Var.t -> Var.t) -> LustreExpr.expr -> LustreExpr.expr
  val map_vars : (Var.t -> Var.t) -> LustreExpr.t -> LustreExpr.t
  val type_of_lustre_expr : LustreExpr.t -> Type.t
  val pp_print_lustre_type : bool -> Format.formatter -> Type.t -> unit
  val pp_print_lustre_var : bool -> Format.formatter -> StateVar.t -> unit
  val pp_print_lustre_var_typed :
    bool -> Format.formatter -> StateVar.t -> unit
  val pp_print_lustre_expr : bool -> Format.formatter -> LustreExpr.t -> unit
  val pp_print_expr :
    ?as_type:Type.t -> bool -> Format.formatter -> LustreExpr.expr -> unit
  val pp_print_term_as_expr :
    ?as_type:Type.t -> bool -> Format.formatter -> Term.t -> unit
  val has_pre_var : Numeral.t -> LustreExpr.t -> bool
  val is_var : LustreExpr.t -> bool
  val is_const_var : LustreExpr.t -> bool
  val is_pre_var : LustreExpr.t -> bool
  val pre_is_unguarded : LustreExpr.t -> bool
  val is_const_expr : LustreExpr.expr -> bool
  val base_offset : Numeral.t
  val cur_offset : Numeral.t
  val pre_offset : Numeral.t
  val base_var_of_state_var : Numeral.t -> StateVar.t -> Var.t
  val cur_var_of_state_var : Numeral.t -> StateVar.t -> Var.t
  val pre_var_of_state_var : Numeral.t -> StateVar.t -> Var.t
  val base_term_of_state_var : Numeral.t -> StateVar.t -> Term.t
  val cur_term_of_state_var : Numeral.t -> StateVar.t -> Term.t
  val pre_term_of_state_var : Numeral.t -> StateVar.t -> Term.t
  val base_term_of_expr : Numeral.t -> LustreExpr.expr -> Term.t
  val cur_term_of_expr : Numeral.t -> LustreExpr.expr -> Term.t
  val pre_term_of_expr : Numeral.t -> LustreExpr.expr -> Term.t
  val base_term_of_t : Numeral.t -> LustreExpr.t -> Term.t
  val cur_term_of_t : Numeral.t -> LustreExpr.t -> Term.t
  val pre_term_of_t : Numeral.t -> LustreExpr.t -> Term.t
  val state_var_of_expr : LustreExpr.t -> StateVar.t
  val var_of_expr : LustreExpr.t -> Var.t
  val state_vars_of_expr : LustreExpr.t -> StateVar.StateVarSet.t
  val vars_of_expr : LustreExpr.t -> Var.VarSet.t
  val base_state_vars_of_init_expr : LustreExpr.t -> StateVar.StateVarSet.t
  val cur_state_vars_of_step_expr : LustreExpr.t -> StateVar.StateVarSet.t
  val indexes_of_state_vars_in_init :
    StateVar.t -> LustreExpr.t -> LustreExpr.expr list list
  val indexes_of_state_vars_in_step :
    StateVar.t -> LustreExpr.t -> LustreExpr.expr list list
  val split_expr_list :
    LustreExpr.t list -> LustreExpr.expr list * LustreExpr.expr list
  val t_true : LustreExpr.t
  val t_false : LustreExpr.t
  val mk_constr : string -> Type.t -> LustreExpr.t
  val mk_int : Numeral.t -> LustreExpr.t
  val mk_real : Decimal.t -> LustreExpr.t
  val mk_var : StateVar.t -> LustreExpr.t
  val mk_free_var : Var.t -> LustreExpr.t
  val mk_index_var : int -> LustreExpr.t
  val int_of_index_var : LustreExpr.t -> int
  val has_indexes : LustreExpr.t -> bool
  val mk_to_int : LustreExpr.t -> LustreExpr.t
  val mk_to_real : LustreExpr.t -> LustreExpr.t
  val mk_ite : LustreExpr.t -> LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_not : LustreExpr.t -> LustreExpr.t
  val mk_uminus : LustreExpr.t -> LustreExpr.t
  val mk_and : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_and_n : LustreExpr.t list -> LustreExpr.t
  val mk_or : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_or_n : LustreExpr.t list -> LustreExpr.t
  val mk_xor : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_impl : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_forall : Var.t list -> LustreExpr.t -> LustreExpr.t
  val mk_exists : Var.t list -> LustreExpr.t -> LustreExpr.t
  val mk_mod : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_minus : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_plus : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_div : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_times : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_intdiv : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_eq : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_neq : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_lte : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_lt : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_gte : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_gt : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_arrow : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_pre :
    ('-> LustreExpr.t -> 'b * 'a) ->
    ('-> Term.t) -> '-> bool -> LustreExpr.t -> LustreExpr.t * 'a
  val mk_select : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val is_select : LustreExpr.t -> bool
  val is_select_array_var : LustreExpr.t -> bool
  val var_of_array_select : LustreExpr.t -> Var.t
  val mk_store : LustreExpr.t -> LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val is_store : LustreExpr.t -> bool
  val mk_let_cur :
    (StateVar.t * LustreExpr.t) list -> LustreExpr.t -> LustreExpr.t
  val mk_let_pre :
    (StateVar.t * LustreExpr.t) list -> LustreExpr.t -> LustreExpr.t
  val mk_int_expr : Numeral.t -> LustreExpr.expr
  val mk_of_expr : ?as_type:Type.t -> LustreExpr.expr -> LustreExpr.t
  val is_const : LustreExpr.t -> bool
  val is_numeral : LustreExpr.expr -> bool
  val numeral_of_expr : LustreExpr.expr -> Numeral.t
  val unsafe_term_of_expr : LustreExpr.expr -> Term.t
  val unsafe_expr_of_term : Term.t -> LustreExpr.expr
  val mk_array : LustreExpr.t -> LustreExpr.t -> LustreExpr.t
  val mk_let : (Var.t * LustreExpr.expr) list -> LustreExpr.t -> LustreExpr.t
  val apply_subst :
    (Var.t * LustreExpr.expr) list -> LustreExpr.t -> LustreExpr.t
end