src/HOL/Tools/typedef_package.ML
changeset 10697 ec197510165a
parent 10675 0b40c19f09f3
child 11426 f280d4b29a2c
equal deleted inserted replaced
10696:76d7f6c9a14c 10697:ec197510165a
   152     val typedefC =
   152     val typedefC =
   153       Const (type_definitionN, (newT --> oldT) --> (oldT --> newT) --> setT --> HOLogic.boolT);
   153       Const (type_definitionN, (newT --> oldT) --> (oldT --> newT) --> setT --> HOLogic.boolT);
   154     val typedef_prop = HOLogic.mk_Trueprop (typedefC $ RepC $ AbsC $ set');
   154     val typedef_prop = HOLogic.mk_Trueprop (typedefC $ RepC $ AbsC $ set');
   155 
   155 
   156     (*theory extender*)
   156     (*theory extender*)
   157     fun do_typedef theory =
   157     fun do_typedef super_theory theory =
   158       theory
   158       theory
   159       |> Theory.assert_super thy
   159       |> Theory.assert_super super_theory
   160       |> add_typedecls [(t, vs, mx)]
   160       |> add_typedecls [(t, vs, mx)]
   161       |> Theory.add_consts_i
   161       |> Theory.add_consts_i
   162        ((if no_def then [] else [(name, setT, NoSyn)]) @
   162        ((if no_def then [] else [(name, setT, NoSyn)]) @
   163         [(Rep_name, newT --> oldT, NoSyn),
   163         [(Rep_name, newT --> oldT, NoSyn),
   164          (Abs_name, oldT --> newT, NoSyn)])
   164          (Abs_name, oldT --> newT, NoSyn)])
   217 
   217 
   218 fun gen_add_typedef prep_term no_def name typ set names thms tac thy =
   218 fun gen_add_typedef prep_term no_def name typ set names thms tac thy =
   219   let
   219   let
   220     val (cset, _, do_typedef) = prepare_typedef prep_term no_def name typ set thy;
   220     val (cset, _, do_typedef) = prepare_typedef prep_term no_def name typ set thy;
   221     val result = prove_nonempty thy cset (names, thms, tac);
   221     val result = prove_nonempty thy cset (names, thms, tac);
   222   in check_nonempty cset result; thy |> do_typedef |> #1 end;
   222   in check_nonempty cset result; thy |> do_typedef thy |> #1 end;
   223 
   223 
   224 val add_typedef = gen_add_typedef read_term false;
   224 val add_typedef = gen_add_typedef read_term false;
   225 val add_typedef_i = gen_add_typedef cert_term false;
   225 val add_typedef_i = gen_add_typedef cert_term false;
   226 val add_typedef_i_no_def = gen_add_typedef cert_term true;
   226 val add_typedef_i_no_def = gen_add_typedef cert_term true;
   227 
   227 
   234 fun gen_typedef_proof prep_term ((name, typ, set), comment) int thy =
   234 fun gen_typedef_proof prep_term ((name, typ, set), comment) int thy =
   235   let
   235   let
   236     val (cset, cset_pat, do_typedef) = prepare_typedef prep_term false name typ set thy;
   236     val (cset, cset_pat, do_typedef) = prepare_typedef prep_term false name typ set thy;
   237     val goal = Thm.term_of (goal_nonempty true cset);
   237     val goal = Thm.term_of (goal_nonempty true cset);
   238     val goal_pat = Thm.term_of (goal_nonempty true cset_pat);
   238     val goal_pat = Thm.term_of (goal_nonempty true cset_pat);
   239   in
   239     val test_thy = Theory.copy thy;
   240     thy
   240   in
   241     |> IsarThy.theorem_i ((("", [typedef_attribute cset do_typedef]),
   241     test_thy |> do_typedef test_thy;  (*preview errors!*)
       
   242     thy |> IsarThy.theorem_i ((("", [typedef_attribute cset (do_typedef thy)]),
   242       (goal, ([goal_pat], []))), comment) int
   243       (goal, ([goal_pat], []))), comment) int
   243   end;
   244   end;
   244 
   245 
   245 val typedef_proof = gen_typedef_proof read_term;
   246 val typedef_proof = gen_typedef_proof read_term;
   246 val typedef_proof_i = gen_typedef_proof cert_term;
   247 val typedef_proof_i = gen_typedef_proof cert_term;