anchor.diff:                              (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 (Thunk.mk (fun () -> BU.format2 "incompatible effects: %s <> %s"
  +        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 (Thunk.mk (fun () -> BU.format2 "incompatible effect arguments: %s <> %s"
  +        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
  
positive.code:          in
           let _, occurs_ok, msg = occurs_check u_lhs arrow in
           if not occurs_ok
           then giveup_or_defer env orig wl (Thunk.mk (fun () -> "occurs-check failed: " ^ (Option.get msg)))
           else aux [] [] formals wl
  
  and solve_binders (env:Env.env) (bs1:binders) (bs2:binders) (orig:prob) (wl:worklist)
  
negative.code:         in
          match quasi_pattern env lhs with
          | None ->
             let msg = mklstr (fun () ->
                          BU.format1 "first_order heuristic cannot solve %s; lhs not a quasi-pattern"
                            (prob_to_string env orig)) in
             giveup_or_defer env orig wl msg
  