anchor.diff:    | EString s -> norm_ret (TName (Id "string")) (AE_Exp e)
     | EOp (Uop (UConst | UOld) as op, [e]) ->
         let (t, ae) = infer_exp env u e expected_typ in
  -      ret t.norm_typ (AE_Op (op, [ae]))
  +      ret t (AE_Op (op, [ae]))
     | EOp (Uop UNeg, [e]) ->
         let (t, ae) = infer_exp env u e None in
  -      let t = neg_int_bound t.norm_typ in
  +      let t = neg_int_bound t in
         norm_ret t (AE_Op (Uop UNeg, [ae]))
     | EOp (Uop (UNot _) as op, [e]) ->
         let tv = u_next_type_var u in
  
positive.code:       let e = eapply (Operator (x + "[]")) [e1; e2] in
        let (t, ae) = infer_exp env u e expected_typ in
        match ae with
        | (AE_Apply (_, _, es), _) -> ret t.norm_typ (AE_Op (Subscript, es)) // TODO: save x or t1
        | _ -> internalErr ("EOp Subscript")
      )
    | EOp (Update, [e1; e2; e3]) ->
  
negative.code: let join2 (env:env) (t1:typ) (t2:typ):typ option =
    let t1 = normalize_type env t1 in
    let t2 = normalize_type env t2 in
    match (t1, t2) with
    | (TBool BpBool, TBool BpBool) -> Some (TBool BpBool)
    | (TBool BpProp, TBool BpBool) | (TBool BpBool, TBool BpProp) | (TBool BpProp, TBool BpProp) -> Some (TBool BpProp)
  