sig
  type optimization_rewrite_rule =
      Logical_algebra_types.logical_compile_context ->
      Logical_algebra_types.logical_algop_expr ->
      Logical_algebra_types.logical_algop_expr * bool
  type optimization_removal_rewrite_rule =
      Logical_algebra_types.logical_compile_context ->
      Logical_algebra_types.logical_algop_expr ->
      Logical_algebra_types.logical_algop_expr ->
      Logical_algebra_types.logical_algop_expr * bool
  type sub_expr_kind = Dependent | Independent
  type ('a, 'b) child_desc =
      ('a, 'b) Xquery_algebra_ast.aalgop_expr *
      Optimization_walker.sub_expr_kind * int
  val get_sub_expr :
    ('a, 'b) Xquery_algebra_ast.aalgop_expr ->
    Optimization_walker.sub_expr_kind ->
    ('a, 'b) Xquery_algebra_ast.aalgop_sub_exprs
  val make_child_desc :
    ('a, 'b) Xquery_algebra_ast.aalgop_expr ->
    Optimization_walker.sub_expr_kind ->
    int -> ('a, 'b) Optimization_walker.child_desc
  val update_parent :
    ('a, 'b) Optimization_walker.child_desc option ->
    ('a, 'b) Xquery_algebra_ast.aalgop_expr -> unit
  val get_op_from_sub_expr :
    ('a, 'b) Xquery_algebra_ast.aalgop_expr ->
    Optimization_walker.sub_expr_kind ->
    int -> ('a, 'b) Xquery_algebra_ast.aalgop_expr
  val descendent_walker :
    ('-> bool) -> ('-> 'a) -> 'a option -> '-> 'a * 'a option * bool
  val rewrite_apply :
    ((Logical_algebra_types.logical_algop_expr *
      Optimization_walker.sub_expr_kind * int)
     option ->
     Logical_algebra_types.logical_algop_expr ->
     Logical_algebra_types.logical_algop_expr) ->
    (Logical_algebra_types.logical_algop_expr *
     Optimization_walker.sub_expr_kind * int)
    option ->
    Logical_algebra_types.logical_algop_expr ->
    Logical_algebra_types.logical_algop_expr
  val fold_over_algop :
    (('a, 'b) Xquery_algebra_ast.aalgop_expr -> 'c) ->
    ('-> '-> 'd) -> '-> ('a, 'b) Xquery_algebra_ast.aalgop_expr -> 'd
  val generic_wrapper :
    (Logical_algebra_types.logical_compile_context ->
     Logical_algebra_types.logical_algop_expr ->
     Logical_algebra_types.logical_algop_expr * bool) ->
    bool Pervasives.ref ->
    Logical_algebra_types.logical_compile_context ->
    Logical_algebra_types.logical_algop_expr ->
    (Logical_algebra_types.logical_algop_expr *
     Optimization_walker.sub_expr_kind * int)
    option ->
    Logical_algebra_types.logical_algop_expr ->
    Logical_algebra_types.logical_algop_expr
  val removal_wrapper :
    (Logical_algebra_types.logical_compile_context ->
     Logical_algebra_types.logical_algop_expr ->
     Logical_algebra_types.logical_algop_expr ->
     Logical_algebra_types.logical_algop_expr * bool) ->
    bool Pervasives.ref ->
    Logical_algebra_types.logical_compile_context ->
    Logical_algebra_types.logical_algop_expr ->
    (Logical_algebra_types.logical_algop_expr *
     Optimization_walker.sub_expr_kind * int)
    option ->
    Logical_algebra_types.logical_algop_expr ->
    Logical_algebra_types.logical_algop_expr
end