src/Pure/Isar/proof_context.ML
changeset 56025 d74fed45fa8b
parent 56007 1b61dfbcf9a4
child 56040 98d466e6de8a
equal deleted inserted replaced
56024:0921c1dc344c 56025:d74fed45fa8b
  1150 
  1150 
  1151 
  1151 
  1152 (** cases **)
  1152 (** cases **)
  1153 
  1153 
  1154 fun dest_cases ctxt =
  1154 fun dest_cases ctxt =
  1155   Symtab.fold (fn (a, (c, i)) => cons (i, (a, c))) (#2 (cases_of ctxt)) []
  1155   Name_Space.fold_table (fn (a, (c, i)) => cons (i, (a, c))) (cases_of ctxt) []
  1156   |> sort (int_ord o pairself #1) |> map #2;
  1156   |> sort (int_ord o pairself #1) |> map #2;
  1157 
  1157 
  1158 local
  1158 local
  1159 
  1159 
  1160 fun update_case _ _ ("", _) res = res
  1160 fun update_case _ _ ("", _) res = res
  1161   | update_case _ _ (name, NONE) ((space, tab), index) =
  1161   | update_case _ _ (name, NONE) (cases, index) =
  1162       let
  1162       (Name_Space.del_table name cases, index)
  1163         val tab' = Symtab.delete_safe name tab;
       
  1164       in ((space, tab'), index) end
       
  1165   | update_case context is_proper (name, SOME c) (cases, index) =
  1163   | update_case context is_proper (name, SOME c) (cases, index) =
  1166       let
  1164       let
  1167         val (_, cases') = cases |> Name_Space.define context false
  1165         val (_, cases') = cases |> Name_Space.define context false
  1168           (Binding.make (name, Position.none), ((c, is_proper), index));
  1166           (Binding.make (name, Position.none), ((c, is_proper), index));
  1169         val index' = index + 1;
  1167         val index' = index + 1;
  1177 
  1175 
  1178 fun update_cases is_proper args ctxt =
  1176 fun update_cases is_proper args ctxt =
  1179   let
  1177   let
  1180     val context = Context.Proof ctxt |> Name_Space.map_naming (K Name_Space.default_naming);
  1178     val context = Context.Proof ctxt |> Name_Space.map_naming (K Name_Space.default_naming);
  1181     val cases = cases_of ctxt;
  1179     val cases = cases_of ctxt;
  1182     val index = Symtab.fold (fn _ => Integer.add 1) (#2 cases) 0;
  1180     val index = Name_Space.fold_table (fn _ => Integer.add 1) cases 0;
  1183     val (cases', _) = fold (update_case context is_proper) args (cases, index);
  1181     val (cases', _) = fold (update_case context is_proper) args (cases, index);
  1184   in map_cases (K cases') ctxt end;
  1182   in map_cases (K cases') ctxt end;
  1185 
  1183 
  1186 fun case_result c ctxt =
  1184 fun case_result c ctxt =
  1187   let
  1185   let
  1228 
  1226 
  1229 (* abbreviations *)
  1227 (* abbreviations *)
  1230 
  1228 
  1231 fun pretty_abbrevs show_globals ctxt =
  1229 fun pretty_abbrevs show_globals ctxt =
  1232   let
  1230   let
  1233     val ((space, consts), (_, globals)) =
  1231     val space = const_space ctxt;
       
  1232     val (constants, globals) =
  1234       pairself (#constants o Consts.dest) (#consts (rep_data ctxt));
  1233       pairself (#constants o Consts.dest) (#consts (rep_data ctxt));
  1235     fun add_abbr (_, (_, NONE)) = I
  1234     fun add_abbr (_, (_, NONE)) = I
  1236       | add_abbr (c, (T, SOME t)) =
  1235       | add_abbr (c, (T, SOME t)) =
  1237           if not show_globals andalso Symtab.defined globals c then I
  1236           if not show_globals andalso Symtab.defined globals c then I
  1238           else cons (c, Logic.mk_equals (Const (c, T), t));
  1237           else cons (c, Logic.mk_equals (Const (c, T), t));
  1239     val abbrevs =
  1238     val abbrevs =
  1240       Name_Space.extern_table ctxt (space, Symtab.make (Symtab.fold add_abbr consts []));
  1239       Name_Space.extern_table' ctxt space (Symtab.make (Symtab.fold add_abbr constants []));
  1241   in
  1240   in
  1242     if null abbrevs then []
  1241     if null abbrevs then []
  1243     else [Pretty.big_list "abbreviations:" (map (pretty_term_abbrev ctxt o #2) abbrevs)]
  1242     else [Pretty.big_list "abbreviations:" (map (pretty_term_abbrev ctxt o #2) abbrevs)]
  1244   end;
  1243   end;
  1245 
  1244