src/HOL/Tools/typedef_package.ML
changeset 20046 9c8909fc5865
parent 19705 08de66826677
child 20357 5fb92bd3aaea
equal deleted inserted replaced
20045:e66efbafbf1f 20046:9c8909fc5865
   161        ((if def then [(name, setT', NoSyn)] else []) @
   161        ((if def then [(name, setT', NoSyn)] else []) @
   162         [(Rep_name, newT --> oldT, NoSyn),
   162         [(Rep_name, newT --> oldT, NoSyn),
   163          (Abs_name, oldT --> newT, NoSyn)])
   163          (Abs_name, oldT --> newT, NoSyn)])
   164       |> add_def (Logic.mk_defpair (setC, set))
   164       |> add_def (Logic.mk_defpair (setC, set))
   165       ||>> PureThy.add_axioms_i [((typedef_name, typedef_prop),
   165       ||>> PureThy.add_axioms_i [((typedef_name, typedef_prop),
   166           [apsnd (fn cond_axm => Drule.standard (nonempty RS cond_axm))])]
   166           [apsnd (fn cond_axm => nonempty RS cond_axm)])]
   167       ||> Theory.add_deps "" (dest_Const RepC) typedef_deps
   167       ||> Theory.add_deps "" (dest_Const RepC) typedef_deps
   168       ||> Theory.add_deps "" (dest_Const AbsC) typedef_deps
   168       ||> Theory.add_deps "" (dest_Const AbsC) typedef_deps
   169       |-> (fn (set_def, [type_definition]) => fn thy1 =>
   169       |-> (fn (set_def, [type_definition]) => fn thy1 =>
   170         let
   170         let
   171           fun make th = Drule.standard (th OF [type_definition]);
   171           fun make th = Drule.standard (th OF [type_definition]);
   241   let
   241   let
   242     val name = the_default (#1 typ) opt_name;
   242     val name = the_default (#1 typ) opt_name;
   243     val (cset, goal, _, typedef_result) =
   243     val (cset, goal, _, typedef_result) =
   244       prepare_typedef prep_term def name typ set opt_morphs thy;
   244       prepare_typedef prep_term def name typ set opt_morphs thy;
   245     val _ = message ("Proving non-emptiness of set " ^ quote (string_of_cterm cset) ^ " ...");
   245     val _ = message ("Proving non-emptiness of set " ^ quote (string_of_cterm cset) ^ " ...");
   246     val non_empty = Goal.prove thy [] [] goal (K tac) handle ERROR msg =>
   246     val non_empty = Goal.prove_global thy [] [] goal (K tac) handle ERROR msg =>
   247       cat_error msg ("Failed to prove non-emptiness of " ^ quote (string_of_cterm cset));
   247       cat_error msg ("Failed to prove non-emptiness of " ^ quote (string_of_cterm cset));
   248   in
   248   in
   249     Context.Theory thy
   249     Context.Theory thy
   250     |> typedef_result non_empty
   250     |> typedef_result non_empty
   251     ||> Context.the_theory
   251     ||> Context.the_theory