sig
  val approximate_monotonic : bool Pervasives.ref
  val prune_indef_vars : bool Pervasives.ref
  type matching = (string * int) list
  type matchings = Assignments.assignment_set
  type struc_rule = {
    lhs_struc : Structure.structure;
    rhs_struc : Structure.structure;
    emb_rels : string list;
    rule_s : (int * int) list;
    pre : Formula.formula * (string * bool) list;
  }
  type var_tuples = string array list
  type rule = {
    struc_rule : DiscreteRule.struc_rule option;
    lhs_vars : string list;
    match_formula : Formula.formula;
    rhs_vars : string list;
    add_tuples : (string * DiscreteRule.var_tuples) list;
    del_tuples : (string * DiscreteRule.var_tuples) list;
    rlmap : (string * string) list option;
  }
  val empty_rule : DiscreteRule.rule
  val fluents :
    DiscreteRule.rule list -> Aux.Strings.t * Aux.Strings.t * Aux.Strings.t
  val fluents_make :
    ?only_pos:bool -> (string -> int -> 'a) -> DiscreteRule.rule -> 'a list
  val fluent_preconds :
    DiscreteRule.rule list ->
    (string -> int) ->
    Aux.Strings.t ->
    Aux.Strings.t ->
    Aux.Strings.t -> (string * (string list * Formula.formula)) list
  val map_to_formulas :
    (Formula.formula -> Formula.formula) ->
    DiscreteRule.rule -> DiscreteRule.rule
  val fold_over_formulas :
    (Formula.formula -> '-> 'a) -> DiscreteRule.rule -> '-> 'a
  val map_to_structures :
    (Structure.structure -> Structure.structure) ->
    DiscreteRule.rule -> DiscreteRule.rule
  val orig_rel_of : string -> string
  val special_rel_of : string -> string option
  val find_matchings :
    Structure.structure -> DiscreteRule.rule -> DiscreteRule.matchings
  val choose_match :
    Structure.structure ->
    DiscreteRule.rule -> DiscreteRule.matchings -> DiscreteRule.matching
  val enumerate_matchings :
    Structure.structure ->
    DiscreteRule.rule -> DiscreteRule.matchings -> DiscreteRule.matching list
  val rewrite_single :
    Structure.structure ->
    DiscreteRule.matching -> DiscreteRule.rule -> Structure.structure
  val compile_rule :
    (string * int) list ->
    (string * (string list * Formula.formula)) list ->
    DiscreteRule.struc_rule -> DiscreteRule.rule
  val compile_formula_rule :
    (string * int) list ->
    (string * (string list * Formula.formula)) list ->
    Formula.formula ->
    (string list * (string * string list) list) option ->
    ((string * string option) list * (string * string list) list) option ->
    (Formula.formula * (string * bool) list) option -> DiscreteRule.rule
  val changeable_rels : DiscreteRule.rule list -> string list
  val translate_from_precond :
    precond:Formula.formula ->
    add:(string * string array) list ->
    ?del:(string * string array) list ->
    nondistinct:string array list ->
    emb_rels:string list ->
    signat:(string * int) list ->
    struc_elems:string list -> DiscreteRule.struc_rule
  val matching_str : DiscreteRule.matching -> string
  val rule_str : DiscreteRule.rule -> string
  val rule_obj_str : DiscreteRule.rule -> string
  val fprint_full : bool -> Format.formatter -> DiscreteRule.rule -> unit
  val fprint_rule : Format.formatter -> DiscreteRule.rule -> unit
  val print_rule : DiscreteRule.rule -> unit
  val sprint_rule : DiscreteRule.rule -> string
  val is_alpha_identity : DiscreteRule.struc_rule -> bool
  val build_rule_s :
    ?rule_s:(string * string) list ->
    Structure.structure -> Structure.structure -> (int * int) list
  val compare_diff :
    ?cmp_funs:(float -> float -> bool) ->
    DiscreteRule.struc_rule -> DiscreteRule.struc_rule -> bool * string
end