sig
  val get_atoms : Formula.formula -> Formula.formula list
  val get_relations_constants :
    Formula.formula -> (string * int) list * string list
  val map_to_literals :
    ?save_rels:string list ->
    ?save_rvars:string list ->
    (Formula.formula -> Formula.formula) ->
    (Formula.real_expr -> Formula.real_expr) ->
    (Formula.formula -> Formula.formula) ->
    Formula.formula -> Formula.formula
  val map_to_literals_expr :
    ?save_rels:string list ->
    ?save_rvars:string list ->
    (Formula.formula -> Formula.formula) ->
    (Formula.real_expr -> Formula.real_expr) ->
    (Formula.formula -> Formula.formula) ->
    Formula.real_expr -> Formula.real_expr
  val map_to_atoms_full :
    (Formula.formula -> Formula.formula) ->
    (Formula.real_expr -> Formula.real_expr) ->
    (Formula.formula -> Formula.formula) ->
    Formula.formula -> Formula.formula
  val map_to_atoms_full_re :
    (Formula.formula -> Formula.formula) ->
    (Formula.real_expr -> Formula.real_expr) ->
    (Formula.formula -> Formula.formula) ->
    Formula.real_expr -> Formula.real_expr
  val map_to_atoms :
    (Formula.formula -> Formula.formula) ->
    Formula.formula -> Formula.formula
  val map_to_atoms_expr :
    (Formula.formula -> Formula.formula) ->
    Formula.real_expr -> Formula.real_expr
  type formula_and_expr_map = {
    map_Rel : string -> Formula.const_or_fo_var array -> Formula.formula;
    map_Eq :
      Formula.const_or_fo_var -> Formula.const_or_fo_var -> Formula.formula;
    map_SO :
      Formula.so_var -> Formula.const_or_fo_var array -> Formula.formula;
    map_RealExpr : Formula.real_expr -> Formula.sign_op -> Formula.formula;
    map_Not : Formula.formula -> Formula.formula;
    map_And : Formula.formula list -> Formula.formula;
    map_Or : Formula.formula list -> Formula.formula;
    map_Ex : Formula.var list -> Formula.formula -> Formula.formula;
    map_All : Formula.var list -> Formula.formula -> Formula.formula;
    map_Lfp :
      Formula.so_var ->
      Formula.fo_var array -> Formula.formula -> Formula.formula;
    map_Gfp :
      Formula.so_var ->
      Formula.fo_var array -> Formula.formula -> Formula.formula;
    map_Let :
      string ->
      string list -> Formula.formula -> Formula.formula -> Formula.formula;
    map_RVar : string -> Formula.real_expr;
    map_Const : float -> Formula.real_expr;
    map_Plus : Formula.real_expr -> Formula.real_expr -> Formula.real_expr;
    map_Times : Formula.real_expr -> Formula.real_expr -> Formula.real_expr;
    map_Pow : Formula.real_expr -> Formula.real_expr -> Formula.real_expr;
    map_Fun : string -> Formula.const_or_fo_var -> Formula.real_expr;
    map_Char : Formula.formula -> Formula.real_expr;
    map_Sum :
      Formula.fo_var list ->
      Formula.formula -> Formula.real_expr -> Formula.real_expr;
    map_RLet :
      string -> Formula.real_expr -> Formula.real_expr -> Formula.real_expr;
  }
  val identity_map : FormulaMap.formula_and_expr_map
  val map_formula :
    FormulaMap.formula_and_expr_map -> Formula.formula -> Formula.formula
  val map_real_expr :
    FormulaMap.formula_and_expr_map -> Formula.real_expr -> Formula.real_expr
  type 'a formula_and_expr_fold = {
    fold_Rel : string -> Formula.const_or_fo_var array -> 'a;
    fold_Eq : Formula.const_or_fo_var -> Formula.const_or_fo_var -> 'a;
    fold_SO : Formula.so_var -> Formula.const_or_fo_var array -> 'a;
    fold_RealExpr : '-> Formula.sign_op -> 'a;
    fold_Not : '-> 'a;
    fold_And : '-> '-> 'a;
    fold_Or : '-> '-> 'a;
    fold_Ex : Formula.var list -> '-> 'a;
    fold_All : Formula.var list -> '-> 'a;
    fold_Lfp : Formula.so_var -> Formula.fo_var array -> '-> 'a;
    fold_Gfp : Formula.so_var -> Formula.fo_var array -> '-> 'a;
    fold_Let : string -> string list -> '-> '-> 'a;
    fold_RVar : string -> 'a;
    fold_Const : float -> 'a;
    fold_Plus : '-> '-> 'a;
    fold_Times : '-> '-> 'a;
    fold_Pow : '-> '-> 'a;
    fold_Fun : string -> Formula.const_or_fo_var -> 'a;
    fold_Char : '-> 'a;
    fold_Sum : Formula.fo_var list -> '-> '-> 'a;
    fold_RLet : string -> '-> '-> 'a;
  }
  val make_fold :
    ('-> '-> 'a) -> '-> 'FormulaMap.formula_and_expr_fold
  val fold_formula :
    'FormulaMap.formula_and_expr_fold -> Formula.formula -> 'a
  val fold_real_expr :
    'FormulaMap.formula_and_expr_fold -> Formula.real_expr -> 'a
  val map_to_formulas_expr :
    (Formula.formula -> Formula.formula) ->
    Formula.real_expr -> Formula.real_expr
  val fold_over_formulas_expr :
    (Formula.formula -> '-> 'a) -> Formula.real_expr -> '-> 'a
  val fold_over_literals :
    (Formula.formula -> '-> 'a) -> Formula.formula -> '-> 'a
  val fold_over_atoms :
    (Formula.formula -> '-> 'a) -> Formula.formula -> '-> 'a
  val map_to_all_vars :
    (Formula.var -> Formula.var) -> Formula.formula -> Formula.formula
end