let builtin_env = 
  let arrow_type pos t1 t2 =
    TypApp (pos, TypVar (pos, TName "->"), [ t1; t2 ])
  in
  let tuple_type2 pos t1 t2 = 
    TypApp (pos, TypVar (pos, TName "*"), [ t1; t2 ])
  in
  let gen_tvar v = 
    TypVar (undefined_position, TName v) 
  in
  [|
    TName "pre", (falseNonAssoc, -1, KArrow (KStarKStar), []);
    TName "abs", (falseNonAssoc, -1, KStar, []);
    TName "pi" , (falseEnclosedBy ("{""}"), -1, KArrow (KEmptyRowKStar), []);
    TName "->" , (trueAssocRight, 0, KArrow (KStarKArrow (KStarKStar)), []);
    TName "*"  , (trueNonAssoc, 1, KArrow (KStarKArrow (KStarKStar)), 
          [ (DName "_Tuple", [ TName "a"TName "b" ], 
             arrow_type undefined_position (gen_tvar "a"
               (arrow_type undefined_position (gen_tvar "b")
                  (tuple_type2 undefined_position 
                     (gen_tvar "a") (gen_tvar "b"))))
          ]);
    TName "int" , (falseNonAssoc, 2, KStar, []);
    TName "char", (falseNonAssoc, 2, KStar, []);
    TName "unit", (falseNonAssoc, 3, KStar
             [ (DName "_Unit", [], 
                TypVar (undefined_position, TName "unit"))])
  |]