anchor.diff:      (REDEPTH_CONV: conv->conv),
       (TOP_DEPTH_CONV: conv->conv),
       (TOP_SWEEP_CONV: conv->conv) =
  -  let THENQC conv1 conv2 tm =
  +  let rec THENQC conv1 conv2 tm =
       try let th1 = conv1 tm in
           try let th2 = conv2(rand(concl th1)) in TRANS th1 th2
           with Failure _ -> th1
  
positive.code:   (fun c -> TRY_CONV (DEPTH_QCONV c)),
    (fun c -> TRY_CONV (REDEPTH_QCONV c)),
    (fun c -> TRY_CONV (TOP_DEPTH_QCONV c)),
    (fun c -> TRY_CONV (TOP_SWEEP_QCONV c));;
  
  (* ------------------------------------------------------------------------- *)
  (* Apply at leaves of op-tree; NB any failures at leaves cause failure.      *)
  
negative.code: /// Basic equality reasoning including conversionals.
  module NHol.equal
  
  open FSharp.Compatibility.OCaml
  open lib
  open fusion
  open basics
  open nets
  open printer
  open preterm
  open parser
  
  (*
  (* ------------------------------------------------------------------------- *)
  (* Type abbreviation for conversions.                                        *)
  (* ------------------------------------------------------------------------- *)
  
  type conv = term->thm
  
  (* ------------------------------------------------------------------------- *)
  (* A bit more syntax.                                                        *)
  (* ------------------------------------------------------------------------- *)
  
  let lhand = rand << rator
  
  let lhs = fst << dest_eq
  
  let rhs = snd << dest_eq
  
  (* ------------------------------------------------------------------------- *)
  (* Similar to variant, but even avoids constants, and ignores types.         *)
  