anchor.diff:    | If        of term * option<match_returns_annotation> * term * term
     | Match     of term * option<match_returns_annotation> * list<branch>
     | TryWith   of term * list<branch>
  -  | Ascribed  of term * term * option<term>
  +  | Ascribed  of term * term * option<term> * bool  (* bool says whether equality ascription $: *)
     | Record    of option<term> * list<(lid * term)>
     | Project   of term * lid
  -  | Product   of list<binder> * term                 (* function space *)
  -  | Sum       of list<(either<binder,term>)> * term                 (* dependent tuple *)
  +  | Product   of list<binder> * term                (* function space *)
  +  | Sum       of list<(either<binder,term>)> * term (* dependent tuple *)
     | QForall   of list<binder> * patterns * term
     | QExists   of list<binder> * patterns * term
     | Refine    of binder * term
  
positive.code:     (scrutinee|> term_to_string)
      (match ret_opt with
       | None -> ""
       | Some (as_opt, ret) ->
         Util.format2 "%sreturns %s "
           (match as_opt with
            | None -> ""
            | Some as_ident -> Util.format1 "as %s " (string_of_id as_ident))
  
negative.code: and term = {tm:term'; range:range; level:level}
  
  (* (as y)? returns t *)
  and match_returns_annotation = option<ident> * term * bool
  
  and patterns = list<ident> * list<list<term>>
  
  