anchor.diff:      mk_pattern (PatAscribed (mk_pattern (PatWild None) p.prange, (unit_ty p.prange, None))) p.prange
     | _ -> p
   
  -let rec destruct_app_pattern env is_top_level p = match p.pat with
  +let rec destruct_app_pattern (env:env_t) (is_top_level:bool) (p:pattern)
  +  : either<ident,lid>              // name at the head
  +  * list<pattern>                  // arguments the head is applied to
  +  * option<(term * option<term>)>  // a possible (outermost) ascription on the pattern
  +  =
  +  match p.pat with
     | PatAscribed(p,t) ->
       let (name, args, _) = destruct_app_pattern env is_top_level p in
       (name, args, Some t)
  
positive.code: module P = FStar.Syntax.Print
  module EMB = FStar.Syntax.Embeddings
  module SS = FStar.Syntax.Subst
  
  type annotated_pat = Syntax.pat * list<(bv * Syntax.typ)>
  
  
negative.code:     let op_to_ident x = mk_ident (compile_op 0 (text_of_id x) (range_of_id x), (range_of_id x)) in
      match p.pat with
      | PatOp x ->
          mklet (op_to_ident x) (tun_r (range_of_id x)) None
      | PatVar (x, _) ->
          mklet x (tun_r (range_of_id x)) None
      | PatAscribed({pat=PatOp x}, (t, tacopt)) ->
          let tacopt = BU.map_opt tacopt (desugar_term env) in
          mklet (op_to_ident x) (desugar_term env t) tacopt
  