anchor.diff:    | EOp (Bop (BEquiv | BImply | BExply) as op, [e1; e2]) ->
         let (_, ae1) = infer_exp env u e1 (Some tProp) in
         let (_, ae2) = infer_exp env u e2 (Some tProp) in
  -      norm_ret tProp (AE_Op (op, [ae1; ae2]))
  +      ret tProp (AE_Op (op, [ae1; ae2]))
     | EOp (Bop op, [e1; e2]) when isIcmpOp op ->
       (
         // op in {<, > , <=, >=} and it can be chained
  
positive.code:     let coerce =
        match expected_typ with
        | None -> None
        | Some et -> if normalize_type env t = normalize_type env et then None else Some (t, et)
        in
      u_constrain_subtype_opt u t expected_typ;
      (t, (ae, coerce))
      in
    let norm_ret (t:typ) (ae:aexp_t) =
      ret t ae
      in
    let check_collection_literal (x:id) (pt:primitive_type) (ts_opt:typ list option) (es:exp list) =
      let tv = u_next_type_var u in
  
negative.code:         )
        | _ -> err ("cannot find type '" + (err_id x) + "'")
      )
  
  // HACK: mangle the parameter types. This will not be needed if transform is performed before typechecker.
  let rec normalize_type_with_transform (env:env) (t:typ) (tr:transform_kind option):typ =
  