anchor.diff:                 ASSUME_TAC gth])
   
   let STRUCT_CASES_THEN ttac = REPEAT_TCL STRIP_THM_THEN ttac
  +
   let STRUCT_CASES_TAC = 
  -    STRUCT_CASES_THEN(fun th -> ORELSE (SUBST1_TAC th) (ASSUME_TAC th))
  +    STRUCT_CASES_THEN (fun th -> SUBST1_TAC th |> ORELSE <| ASSUME_TAC th);;
   
   let STRIP_GOAL_THEN ttac = 
       FIRST [GEN_TAC
  
positive.code:         with
          | Failure _ -> failwith "MK_COMB_TAC: Failure."
  
  let (AP_TERM_TAC : tactic) = 
      let tac = THENL MK_COMB_TAC [REFL_TAC; ALL_TAC]
      fun gl -> 
          try 
              tac gl
          with
          | Failure _ -> failwith "AP_TERM_TAC"
  
  let (AP_THM_TAC : tactic) = 
      let tac = THENL MK_COMB_TAC [ALL_TAC; REFL_TAC]
      fun gl -> 
          try 
              tac gl
          with
          | Failure _ -> failwith "AP_THM_TAC"
  
  let (BINOP_TAC : tactic) = 
      let tac = THENL MK_COMB_TAC [AP_TERM_TAC; ALL_TAC]
      fun gl -> 
          try 
              tac gl
          with
          | Failure _ -> failwith "AP_THM_TAC"
  
  let (SUBST1_TAC : thm_tactic) = fun th -> CONV_TAC(SUBS_CONV [th])
  let SUBST_ALL_TAC rth = THEN (SUBST1_TAC rth) (RULE_ASSUM_TAC(SUBS [rth]))
  let BETA_TAC = CONV_TAC(REDEPTH_CONV BETA_CONV)
  
  (* ------------------------------------------------------------------------- *)
  
negative.code:     fun ttac (asl, w as g) -> tryfind (fun (_, th) -> ttac th g) asl
  
  let (RULE_ASSUM_TAC : (thm -> thm) -> tactic) = 
      fun rule (asl,w) ->
          (POP_ASSUM_LIST(K ALL_TAC) |> THEN <|
           MAP_EVERY (fun (s,th) -> LABEL_TAC s (rule th)) (rev asl)) (asl,w)
  
  (* ------------------------------------------------------------------------- *)
  (* Operate on assumption identified by a label.                              *)
  