anchor.diff:  and term = {tm:term'; range:range; level:level}
   
   (* (as y)? returns t *)
  -and match_returns_annotation = option<ident> * term
  +and match_returns_annotation = option<ident> * term * bool
   
   and patterns = list<ident> * list<list<term>>
   
  
positive.code:       (t1|> 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))
             (term_to_string ret))
        (t2|> term_to_string)
        (t3|> term_to_string)
  
negative.code:   | 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> * 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 *)
    | QForall   of list<binder> * patterns * term
    | QExists   of list<binder> * patterns * term
    | Refine    of binder * term
  