anchor.diff:      | [_] -> ret a
       | _ -> fail "expected at most one goal remaining"))
   
  -let merge_sub_goals : tac<unit> = failwith "NYI"
  +let merge_sub_goals : tac<unit> = fun p -> failwith "Not yet implemented: merge_sub_goals"
   
   let visit_strengthen (try_strengthen:tac<unit>)
       : tac<unit>
  
positive.code:         with _ ->
               fail (BU.format1 "Variable not found: %s" (Print.bv_to_string x)))
  
  let clear_hd (x:name) : tac<unit> = ret ()
  let revert_hd (xs:list<name>) : tac<unit> = ret()
  
  (* We often have VCs of the form
           forall x. x==e ==> P
  
negative.code:                         ret ())))
  
  let rec simplify_eq_impl : tac<unit>
      = fun p -> 
            with_cur_goal (fun goal ->
            match destruct_equality_imp goal.goal_ty with
            | Some (x, e, rhs) ->
              bind imp_intro (fun eq_h ->
              bind (rewrite x e) (fun _ ->
              bind (exact eq_h) (fun _ ->
              //get rid of the eq_h in the context
              bind (clear_hd eq_h) (fun _ ->
              //dismiss the first sub-goal, i.e., prove that x=e
              //recursively visit rhs[e/x]
              visit_strengthen simplify_eq_impl))))
            | _ ->
              fail "Not an equality implication") p