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:   | Match(t, ret_opt,  branches) -> try_or_match_to_string x t branches ret_opt
    | TryWith (t, branches) -> try_or_match_to_string x t branches None
  
    | Ascribed(t1, t2, None) ->
      Util.format2 "(%s : %s)" (t1|> term_to_string) (t2|> term_to_string)
    | Ascribed(t1, t2, Some tac) ->
      Util.format3 "(%s : %s by %s)" (t1|> term_to_string) (t2|> term_to_string) (tac |> term_to_string)
    | Record(Some e, fields) ->
      Util.format2 "{%s with %s}" (e|> term_to_string) (to_string_l " " (fun (l,e) -> Util.format2 "%s=%s" ((string_of_lid l)) (e|> term_to_string)) fields)
    | Record(None, fields) ->
  
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>>
  
  