anchor.diff:      let a_tm = (parse_term @"a:bool")
       let b_tm = (parse_term @"b:bool")
       let c_tm = (parse_term @"c:bool")
  +
       let rec distribute tm = 
           match tm with
           | Comb(Comb(Const("\\/", _), a), Comb(Comb(Const("/\\", _), b), c)) -> 
  
positive.code:             let th = MK_COMB(AP_TERM op (weakdnf l), weakdnf r)
              TRANS th (distribute(Choice.get <| rand(concl <| Choice.get th)))
          | _ -> REFL tm
      and substrongdnf tm = 
          match tm with
          | Comb(Const("!", _), Abs(_, _)) | Comb(Const("?", _), Abs(_, _)) -> 
  
negative.code:             let th = MK_COMB(AP_TERM op (substrongcnf l), substrongcnf r)
              TRANS th (distribute(Choice.get <| rand(concl <| Choice.get th)))
          | _ -> REFL tm
  
      and strongcnf tm = 
          let th = substrongcnf tm
          TRANS th (strengthen(Choice.get <| rand(concl <| Choice.get th)))
  
      weakcnf, strongcnf
  
  (* ------------------------------------------------------------------------- *)
  (* Simply right-associate w.r.t. a binary operator.                          *)
  (* ------------------------------------------------------------------------- *)
  
  /// Right-associates a term with respect to an associative binary operator.
  let ASSOC_CONV th = 
      let th' = SYM(SPEC_ALL th)
  