anchor.diff:            else if is_arrow rhs
             then imitate_arrow orig env wl lhs bs_lhs t_res_lhs EQ rhs
             else
  -            let msg = Thunk.mk (fun () ->
  +            let msg = mklstr (fun () ->
                                     BU.format1 "first_order heuristic cannot solve %s; rhs not an app or arrow"
                                     (prob_to_string env orig)) in
               giveup_or_defer env orig wl msg
  
positive.code:     Failed (prob, reason)
  
  let giveup_lit env (reason : string) prob =
      giveup env (Thunk.mk (fun () -> reason)) prob
  
  (* ------------------------------------------------*)
  (* </worklist ops>                                 *)
  
negative.code:                             (Print.comp_to_string (mk_Comp c1_comp))
                              (Print.comp_to_string (mk_Comp c2_comp)) in
          if not (lid_equals c1_comp.effect_name c2_comp.effect_name)
          then giveup env (mklstr (fun () -> BU.format2 "incompatible effects: %s <> %s"
                                          (Print.lid_to_string c1_comp.effect_name)
                                          (Print.lid_to_string c2_comp.effect_name))) orig
          else if List.length c1_comp.effect_args <> List.length c2_comp.effect_args
          then giveup env (mklstr (fun () -> BU.format2 "incompatible effect arguments: %s <> %s"
                                          (Print.args_to_string c1_comp.effect_args)
                                          (Print.args_to_string c2_comp.effect_args))) orig
          else
  