src/Pure/Isar/proof_context.ML
changeset 62767 d6b0d35b3aed
parent 62078 76399b8fde4d
child 62768 5f5f11ee4d37
equal deleted inserted replaced
62766:70b73465f636 62767:d6b0d35b3aed
  1060 
  1060 
  1061 fun declare_var (x, opt_T, mx) ctxt =
  1061 fun declare_var (x, opt_T, mx) ctxt =
  1062   let val T = (case opt_T of SOME T => T | NONE => Mixfix.mixfixT mx)
  1062   let val T = (case opt_T of SOME T => T | NONE => Mixfix.mixfixT mx)
  1063   in ((x, T, mx), ctxt |> Variable.declare_constraints (Free (x, T))) end;
  1063   in ((x, T, mx), ctxt |> Variable.declare_constraints (Free (x, T))) end;
  1064 
  1064 
       
  1065 fun add_syntax vars ctxt =
       
  1066   map_syntax_idents (Local_Syntax.add_syntax ctxt (map (pair Local_Syntax.Fixed) vars)) ctxt;
       
  1067 
  1065 fun check_var internal b =
  1068 fun check_var internal b =
  1066   let
  1069   let
  1067     val x = Variable.check_name b;
  1070     val x = Variable.check_name b;
  1068     val check = if internal then Name.reject_skolem else Name.reject_internal;
  1071     val check = if internal then Name.reject_skolem else Name.reject_internal;
  1069     val _ =
  1072     val _ =
  1071       else error ("Bad name: " ^ Binding.print b);
  1074       else error ("Bad name: " ^ Binding.print b);
  1072   in x end;
  1075   in x end;
  1073 
  1076 
  1074 local
  1077 local
  1075 
  1078 
       
  1079 fun check_mixfix ctxt (b, opt_T, mx) =
       
  1080   let
       
  1081     val ([x], ctxt') = Variable.add_fixes_binding [Binding.reset_pos b] ctxt;
       
  1082     val mx' = Mixfix.reset_pos mx;
       
  1083     val T = #2 (#1 (declare_var (x, opt_T, mx') ctxt));
       
  1084     val _ = add_syntax [(x, T, if Context_Position.is_visible ctxt then mx else mx')] ctxt';
       
  1085   in mx' end;
       
  1086 
  1076 fun prep_var prep_typ internal (b, raw_T, mx) ctxt =
  1087 fun prep_var prep_typ internal (b, raw_T, mx) ctxt =
  1077   let
  1088   let
  1078     val x = check_var internal b;
  1089     val x = check_var internal b;
  1079     fun cond_tvars T =
  1090     fun cond_tvars T =
  1080       if internal then T
  1091       if internal then T
  1081       else Type.no_tvars T handle TYPE (msg, _, _) => error msg;
  1092       else Type.no_tvars T handle TYPE (msg, _, _) => error msg;
  1082     val opt_T = Option.map (cond_tvars o prep_typ ctxt) raw_T;
  1093     val opt_T = Option.map (cond_tvars o prep_typ ctxt) raw_T;
  1083     val (_, ctxt') = ctxt |> declare_var (x, opt_T, mx);
  1094     val mx' = if Mixfix.is_empty mx then mx else check_mixfix ctxt (b, opt_T, mx);
  1084   in ((b, opt_T, mx), ctxt') end;
  1095     val (_, ctxt') = ctxt |> declare_var (x, opt_T, mx');
       
  1096   in ((b, opt_T, mx'), ctxt') end;
  1085 
  1097 
  1086 in
  1098 in
  1087 
  1099 
  1088 val read_var = prep_var Syntax.read_typ false;
  1100 val read_var = prep_var Syntax.read_typ false;
  1089 val cert_var = prep_var cert_typ true;
  1101 val cert_var = prep_var cert_typ true;
  1183     val (vars, _) = fold_map prep_var raw_vars ctxt;
  1195     val (vars, _) = fold_map prep_var raw_vars ctxt;
  1184     val (xs, ctxt') = Variable.add_fixes_binding (map #1 vars) ctxt;
  1196     val (xs, ctxt') = Variable.add_fixes_binding (map #1 vars) ctxt;
  1185   in
  1197   in
  1186     ctxt'
  1198     ctxt'
  1187     |> fold_map declare_var (map2 (fn x => fn (_, T, mx) => (x, T, mx)) xs vars)
  1199     |> fold_map declare_var (map2 (fn x => fn (_, T, mx) => (x, T, mx)) xs vars)
  1188     |-> (map_syntax_idents o Local_Syntax.add_syntax ctxt o map (pair Local_Syntax.Fixed))
  1200     |-> add_syntax
  1189     |> pair xs
  1201     |> pair xs
  1190   end;
  1202   end;
  1191 
  1203 
  1192 in
  1204 in
  1193 
  1205