anchor.diff:  (* ------------------------------------------------------------------------- *)
   (* Derived congruence rules; very useful things!                             *)
   (* ------------------------------------------------------------------------- *)
  +/// Conjoin both sides of two equational theorems.
   let MK_CONJ = 
       let andtm = parse_term @"(/\)"
       fun eq1 eq2 -> MK_COMB(AP_TERM andtm eq1, eq2)
   
  +/// Disjoin both sides of two equational theorems.
   let MK_DISJ = 
       let ortm = parse_term @"(\/)"
       fun eq1 eq2 -> MK_COMB(AP_TERM ortm eq1, eq2)
   
  +/// Universally quantifies both sides of equational theorem.
   let MK_FORALL = 
       let atm = mk_const("!", [])
       fun v th -> AP_TERM (inst [type_of v, aty] atm) (ABS v th)
   
  +/// Existentially quantifies both sides of equational theorem.
   let MK_EXISTS = 
       let atm = mk_const("?", [])
       fun v th -> AP_TERM (inst [type_of v, aty] atm) (ABS v th)
  
positive.code: (* Instantiate theorem by matching part of it to a term.                     *)
  (* The GEN_PART_MATCH version renames free vars to avoid clashes.            *)
  (* ------------------------------------------------------------------------- *)
  let PART_MATCH, GEN_PART_MATCH = 
      let rec match_bvs t1 t2 acc = 
          try 
  
negative.code: (* ------------------------------------------------------------------------- *)
  (* Multiple beta-reduction (we use a slight variant below).                  *)
  (* ------------------------------------------------------------------------- *)
  /// Beta conversion over multiple arguments.
  let rec BETAS_CONV tm = 
      match tm with
      | Comb(Abs(_, _), _) -> BETA_CONV tm
  