| author | haftmann | 
| Tue, 21 Dec 2010 17:52:23 +0100 | |
| changeset 41373 | 48503e4e96b6 | 
| parent 39288 | f1ae2493d93f | 
| child 41444 | 7f40120cd814 | 
| permissions | -rw-r--r-- | 
| 37744 | 1 | (* Title: HOL/Tools/Quotient/quotient_typ.ML | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 2 | Author: Cezary Kaliszyk and Christian Urban | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 3 | |
| 35806 
a814cccce0b8
rollback of local typedef until problem with type-variables can be sorted out; fixed header
 Christian Urban <urbanc@in.tum.de> parents: 
35790diff
changeset | 4 | Definition of a quotient type. | 
| 35790 
a9507cd84326
removed Local_Theory.theory_result by using local Typedef.add_typedef
 Christian Urban <urbanc@in.tum.de> parents: 
35788diff
changeset | 5 | |
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 6 | *) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 7 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 8 | signature QUOTIENT_TYPE = | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 9 | sig | 
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 10 | val add_quotient_type: ((string list * binding * mixfix) * (typ * term * bool)) * thm | 
| 37530 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 11 | -> Proof.context -> Quotient_Info.quotdata_info * local_theory | 
| 35415 
1810b1ade437
export add_quotient_type.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35351diff
changeset | 12 | |
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 13 | val quotient_type: ((string list * binding * mixfix) * (typ * term * bool)) list | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 14 | -> Proof.context -> Proof.state | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 15 | |
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 16 | val quotient_type_cmd: ((((string list * binding) * mixfix) * string) * (bool * string)) list | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 17 | -> Proof.context -> Proof.state | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 18 | end; | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 19 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 20 | structure Quotient_Type: QUOTIENT_TYPE = | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 21 | struct | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 22 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 23 | open Quotient_Info; | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 24 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 25 | (* wrappers for define, note, Attrib.internal and theorem_i *) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 26 | fun define (name, mx, rhs) lthy = | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 27 | let | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 28 | val ((rhs, (_ , thm)), lthy') = | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 29 | Local_Theory.define ((name, mx), (Attrib.empty_binding, rhs)) lthy | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 30 | in | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 31 | ((rhs, thm), lthy') | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 32 | end | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 33 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 34 | fun note (name, thm, attrs) lthy = | 
| 37530 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 35 | Local_Theory.note ((name, attrs), [thm]) lthy |> snd | 
| 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 36 | |
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 37 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 38 | fun intern_attr at = Attrib.internal (K at) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 39 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 40 | fun theorem after_qed goals ctxt = | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 41 | let | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 42 | val goals' = map (rpair []) goals | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 43 | fun after_qed' thms = after_qed (the_single thms) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 44 | in | 
| 36323 
655e2d74de3a
modernized naming conventions of main Isar proof elements;
 wenzelm parents: 
35994diff
changeset | 45 | Proof.theorem NONE after_qed' [goals'] ctxt | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 46 | end | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 47 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 48 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 49 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 50 | (*** definition of quotient types ***) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 51 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 52 | val mem_def1 = @{lemma "y : S ==> S y" by (simp add: mem_def)}
 | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 53 | val mem_def2 = @{lemma "S y ==> y : S" by (simp add: mem_def)}
 | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 54 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 55 | (* constructs the term lambda (c::rty => bool). EX (x::rty). c = rel x *) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 56 | fun typedef_term rel rty lthy = | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 57 | let | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 58 | val [x, c] = | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 59 |     [("x", rty), ("c", HOLogic.mk_setT rty)]
 | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 60 | |> Variable.variant_frees lthy [rel] | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 61 | |> map Free | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 62 | in | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 63 | lambda c (HOLogic.exists_const rty $ | 
| 37530 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 64 | lambda x (HOLogic.mk_conj (rel $ x $ x, HOLogic.mk_eq (c, rel $ x)))) | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 65 | end | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 66 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 67 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 68 | (* makes the new type definitions and proves non-emptyness *) | 
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 69 | fun typedef_make (vs, qty_name, mx, rel, rty) equiv_thm lthy = | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 70 | let | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 71 | val typedef_tac = | 
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 72 |     EVERY1 (map rtac [@{thm part_equivp_typedef}, equiv_thm])
 | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 73 | in | 
| 35806 
a814cccce0b8
rollback of local typedef until problem with type-variables can be sorted out; fixed header
 Christian Urban <urbanc@in.tum.de> parents: 
35790diff
changeset | 74 | (* FIXME: purely local typedef causes at the moment | 
| 
a814cccce0b8
rollback of local typedef until problem with type-variables can be sorted out; fixed header
 Christian Urban <urbanc@in.tum.de> parents: 
35790diff
changeset | 75 | problems with type variables | 
| 
a814cccce0b8
rollback of local typedef until problem with type-variables can be sorted out; fixed header
 Christian Urban <urbanc@in.tum.de> parents: 
35790diff
changeset | 76 | |
| 35790 
a9507cd84326
removed Local_Theory.theory_result by using local Typedef.add_typedef
 Christian Urban <urbanc@in.tum.de> parents: 
35788diff
changeset | 77 | Typedef.add_typedef false NONE (qty_name, vs, mx) | 
| 
a9507cd84326
removed Local_Theory.theory_result by using local Typedef.add_typedef
 Christian Urban <urbanc@in.tum.de> parents: 
35788diff
changeset | 78 | (typedef_term rel rty lthy) NONE typedef_tac lthy | 
| 35806 
a814cccce0b8
rollback of local typedef until problem with type-variables can be sorted out; fixed header
 Christian Urban <urbanc@in.tum.de> parents: 
35790diff
changeset | 79 | *) | 
| 38757 
2b3e054ae6fc
renamed Local_Theory.theory(_result) to Local_Theory.background_theory(_result) to emphasize that this belongs to the infrastructure and is rarely appropriate in user-space tools;
 wenzelm parents: 
38387diff
changeset | 80 | (* FIXME should really use local typedef here *) | 
| 
2b3e054ae6fc
renamed Local_Theory.theory(_result) to Local_Theory.background_theory(_result) to emphasize that this belongs to the infrastructure and is rarely appropriate in user-space tools;
 wenzelm parents: 
38387diff
changeset | 81 | Local_Theory.background_theory_result | 
| 35806 
a814cccce0b8
rollback of local typedef until problem with type-variables can be sorted out; fixed header
 Christian Urban <urbanc@in.tum.de> parents: 
35790diff
changeset | 82 | (Typedef.add_typedef_global false NONE | 
| 35842 | 83 | (qty_name, map (rpair dummyS) vs, mx) | 
| 35806 
a814cccce0b8
rollback of local typedef until problem with type-variables can be sorted out; fixed header
 Christian Urban <urbanc@in.tum.de> parents: 
35790diff
changeset | 84 | (typedef_term rel rty lthy) | 
| 
a814cccce0b8
rollback of local typedef until problem with type-variables can be sorted out; fixed header
 Christian Urban <urbanc@in.tum.de> parents: 
35790diff
changeset | 85 | NONE typedef_tac) lthy | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 86 | end | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 87 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 88 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 89 | (* tactic to prove the quot_type theorem for the new type *) | 
| 35994 
9cc3df9a606e
Typedef.info: separate global and local part, only the latter is transformed by morphisms;
 wenzelm parents: 
35842diff
changeset | 90 | fun typedef_quot_type_tac equiv_thm ((_, typedef_info): Typedef.info) = | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 91 | let | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 92 | val rep_thm = #Rep typedef_info RS mem_def1 | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 93 | val rep_inv = #Rep_inverse typedef_info | 
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 94 | val abs_inv = #Abs_inverse typedef_info | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 95 | val rep_inj = #Rep_inject typedef_info | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 96 | in | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 97 |   (rtac @{thm quot_type.intro} THEN' RANGE [
 | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 98 | rtac equiv_thm, | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 99 | rtac rep_thm, | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 100 | rtac rep_inv, | 
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 101 | rtac abs_inv THEN' rtac mem_def2 THEN' atac, | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 102 | rtac rep_inj]) 1 | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 103 | end | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 104 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 105 | (* proves the quot_type theorem for the new type *) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 106 | fun typedef_quot_type_thm (rel, abs, rep, equiv_thm, typedef_info) lthy = | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 107 | let | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 108 |   val quot_type_const = Const (@{const_name "quot_type"}, dummyT)
 | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 109 | val goal = | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 110 | HOLogic.mk_Trueprop (quot_type_const $ rel $ abs $ rep) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 111 | |> Syntax.check_term lthy | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 112 | in | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 113 | Goal.prove lthy [] [] goal | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 114 | (K (typedef_quot_type_tac equiv_thm typedef_info)) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 115 | end | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 116 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 117 | (* main function for constructing a quotient type *) | 
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 118 | fun add_quotient_type (((vs, qty_name, mx), (rty, rel, partial)), equiv_thm) lthy = | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 119 | let | 
| 37530 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 120 | val part_equiv = | 
| 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 121 | if partial | 
| 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 122 | then equiv_thm | 
| 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 123 |     else equiv_thm RS @{thm equivp_implies_part_equivp}
 | 
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 124 | |
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 125 | (* generates the typedef *) | 
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 126 | val ((qty_full_name, typedef_info), lthy1) = typedef_make (vs, qty_name, mx, rel, rty) part_equiv lthy | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 127 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 128 | (* abs and rep functions from the typedef *) | 
| 35994 
9cc3df9a606e
Typedef.info: separate global and local part, only the latter is transformed by morphisms;
 wenzelm parents: 
35842diff
changeset | 129 | val Abs_ty = #abs_type (#1 typedef_info) | 
| 
9cc3df9a606e
Typedef.info: separate global and local part, only the latter is transformed by morphisms;
 wenzelm parents: 
35842diff
changeset | 130 | val Rep_ty = #rep_type (#1 typedef_info) | 
| 
9cc3df9a606e
Typedef.info: separate global and local part, only the latter is transformed by morphisms;
 wenzelm parents: 
35842diff
changeset | 131 | val Abs_name = #Abs_name (#1 typedef_info) | 
| 
9cc3df9a606e
Typedef.info: separate global and local part, only the latter is transformed by morphisms;
 wenzelm parents: 
35842diff
changeset | 132 | val Rep_name = #Rep_name (#1 typedef_info) | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 133 | val Abs_const = Const (Abs_name, Rep_ty --> Abs_ty) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 134 | val Rep_const = Const (Rep_name, Abs_ty --> Rep_ty) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 135 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 136 | (* more useful abs and rep definitions *) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 137 |   val abs_const = Const (@{const_name "quot_type.abs"}, dummyT )
 | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 138 |   val rep_const = Const (@{const_name "quot_type.rep"}, dummyT )
 | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 139 | val abs_trm = Syntax.check_term lthy1 (abs_const $ rel $ Abs_const) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 140 | val rep_trm = Syntax.check_term lthy1 (rep_const $ Rep_const) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 141 | val abs_name = Binding.prefix_name "abs_" qty_name | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 142 | val rep_name = Binding.prefix_name "rep_" qty_name | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 143 | |
| 38387 | 144 | val ((_, abs_def), lthy2) = define (abs_name, NoSyn, abs_trm) lthy1 | 
| 145 | val ((_, rep_def), lthy3) = define (rep_name, NoSyn, rep_trm) lthy2 | |
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 146 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 147 | (* quot_type theorem *) | 
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 148 | val quot_thm = typedef_quot_type_thm (rel, Abs_const, Rep_const, part_equiv, typedef_info) lthy3 | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 149 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 150 | (* quotient theorem *) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 151 | val quotient_thm_name = Binding.prefix_name "Quotient_" qty_name | 
| 38387 | 152 | val quotient_thm = | 
| 153 |     (quot_thm RS @{thm quot_type.Quotient})
 | |
| 154 | |> fold_rule [abs_def, rep_def] | |
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 155 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 156 | (* name equivalence theorem *) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 157 | val equiv_thm_name = Binding.suffix_name "_equivp" qty_name | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 158 | |
| 37530 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 159 | (* storing the quotdata *) | 
| 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 160 |   val quotdata = {qtyp = Abs_ty, rtyp = rty, equiv_rel = rel, equiv_thm = equiv_thm}
 | 
| 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 161 | |
| 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 162 | fun qinfo phi = transform_quotdata phi quotdata | 
| 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 163 | |
| 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 164 | val lthy4 = lthy3 | 
| 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 165 | |> Local_Theory.declaration true (fn phi => quotdata_update_gen qty_full_name (qinfo phi)) | 
| 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 166 | |> note (equiv_thm_name, equiv_thm, if partial then [] else [intern_attr equiv_rules_add]) | 
| 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 167 | |> note (quotient_thm_name, quotient_thm, [intern_attr quotient_rules_add]) | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 168 | in | 
| 37530 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 169 | (quotdata, lthy4) | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 170 | end | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 171 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 172 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 173 | (* sanity checks for the quotient type specifications *) | 
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 174 | fun sanity_check ((vs, qty_name, _), (rty, rel, _)) = | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 175 | let | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 176 | val rty_tfreesT = map fst (Term.add_tfreesT rty []) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 177 | val rel_tfrees = map fst (Term.add_tfrees rel []) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 178 | val rel_frees = map fst (Term.add_frees rel []) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 179 | val rel_vars = Term.add_vars rel [] | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 180 | val rel_tvars = Term.add_tvars rel [] | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 181 | val qty_str = Binding.str_of qty_name ^ ": " | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 182 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 183 | val illegal_rel_vars = | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 184 | if null rel_vars andalso null rel_tvars then [] | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 185 | else [qty_str ^ "illegal schematic variable(s) in the relation."] | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 186 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 187 | val dup_vs = | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 188 | (case duplicates (op =) vs of | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 189 | [] => [] | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 190 | | dups => [qty_str ^ "duplicate type variable(s) on the lhs: " ^ commas_quote dups]) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 191 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 192 | val extra_rty_tfrees = | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 193 | (case subtract (op =) vs rty_tfreesT of | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 194 | [] => [] | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 195 | | extras => [qty_str ^ "extra type variable(s) on the lhs: " ^ commas_quote extras]) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 196 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 197 | val extra_rel_tfrees = | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 198 | (case subtract (op =) vs rel_tfrees of | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 199 | [] => [] | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 200 | | extras => [qty_str ^ "extra type variable(s) in the relation: " ^ commas_quote extras]) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 201 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 202 | val illegal_rel_frees = | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 203 | (case rel_frees of | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 204 | [] => [] | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 205 | | xs => [qty_str ^ "illegal variable(s) in the relation: " ^ commas_quote xs]) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 206 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 207 | val errs = illegal_rel_vars @ dup_vs @ extra_rty_tfrees @ extra_rel_tfrees @ illegal_rel_frees | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 208 | in | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 209 | if null errs then () else error (cat_lines errs) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 210 | end | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 211 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 212 | (* check for existence of map functions *) | 
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 213 | fun map_check ctxt (_, (rty, _, _)) = | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 214 | let | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 215 | val thy = ProofContext.theory_of ctxt | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 216 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 217 | fun map_check_aux rty warns = | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 218 | case rty of | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 219 | Type (_, []) => warns | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 220 | | Type (s, _) => if maps_defined thy s then warns else s::warns | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 221 | | _ => warns | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 222 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 223 | val warns = map_check_aux rty [] | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 224 | in | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 225 | if null warns then () | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 226 |   else warning ("No map function defined for " ^ commas warns ^
 | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 227 | ". This will cause problems later on.") | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 228 | end | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 229 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 230 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 231 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 232 | (*** interface and syntax setup ***) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 233 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 234 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 235 | (* the ML-interface takes a list of 5-tuples consisting of: | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 236 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 237 | - the name of the quotient type | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 238 | - its free type variables (first argument) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 239 | - its mixfix annotation | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 240 | - the type to be quotient | 
| 37530 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 241 | - the partial flag (a boolean) | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 242 | - the relation according to which the type is quotient | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 243 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 244 | it opens a proof-state in which one has to show that the | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 245 | relations are equivalence relations | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 246 | *) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 247 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 248 | fun quotient_type quot_list lthy = | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 249 | let | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 250 | (* sanity check *) | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 251 | val _ = List.app sanity_check quot_list | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 252 | val _ = List.app (map_check lthy) quot_list | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 253 | |
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 254 | fun mk_goal (rty, rel, partial) = | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 255 | let | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 256 |     val equivp_ty = ([rty, rty] ---> @{typ bool}) --> @{typ bool}
 | 
| 37530 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 257 | val const = | 
| 
70d03844b2f9
export of proper information in the ML-interface of the quotient package
 Christian Urban <urbanc@in.tum.de> parents: 
37493diff
changeset | 258 |       if partial then @{const_name part_equivp} else @{const_name equivp}
 | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 259 | in | 
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 260 | HOLogic.mk_Trueprop (Const (const, equivp_ty) $ rel) | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 261 | end | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 262 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 263 | val goals = map (mk_goal o snd) quot_list | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 264 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 265 | fun after_qed thms lthy = | 
| 35415 
1810b1ade437
export add_quotient_type.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
35351diff
changeset | 266 | fold_map add_quotient_type (quot_list ~~ thms) lthy |> snd | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 267 | in | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 268 | theorem after_qed goals lthy | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 269 | end | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 270 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 271 | fun quotient_type_cmd specs lthy = | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 272 | let | 
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 273 | fun parse_spec ((((vs, qty_name), mx), rty_str), (partial, rel_str)) lthy = | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 274 | let | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 275 | val rty = Syntax.read_typ lthy rty_str | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 276 | val lthy1 = Variable.declare_typ rty lthy | 
| 35790 
a9507cd84326
removed Local_Theory.theory_result by using local Typedef.add_typedef
 Christian Urban <urbanc@in.tum.de> parents: 
35788diff
changeset | 277 | val rel = | 
| 
a9507cd84326
removed Local_Theory.theory_result by using local Typedef.add_typedef
 Christian Urban <urbanc@in.tum.de> parents: 
35788diff
changeset | 278 | Syntax.parse_term lthy1 rel_str | 
| 39288 | 279 |       |> Type.constraint (rty --> rty --> @{typ bool}) 
 | 
| 35790 
a9507cd84326
removed Local_Theory.theory_result by using local Typedef.add_typedef
 Christian Urban <urbanc@in.tum.de> parents: 
35788diff
changeset | 280 | |> Syntax.check_term lthy1 | 
| 
a9507cd84326
removed Local_Theory.theory_result by using local Typedef.add_typedef
 Christian Urban <urbanc@in.tum.de> parents: 
35788diff
changeset | 281 | val lthy2 = Variable.declare_term rel lthy1 | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 282 | in | 
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 283 | (((vs, qty_name, mx), (rty, rel, partial)), lthy2) | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 284 | end | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 285 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 286 | val (spec', lthy') = fold_map parse_spec specs lthy | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 287 | in | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 288 | quotient_type spec' lthy' | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 289 | end | 
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 290 | |
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 291 | val partial = Scan.optional (Parse.reserved "partial" -- Parse.$$$ ":" >> K true) false | 
| 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 292 | |
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 293 | val quotspec_parser = | 
| 37493 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 294 | Parse.and_list1 | 
| 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 295 | ((Parse.type_args -- Parse.binding) -- | 
| 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 296 | Parse.opt_mixfix -- (Parse.$$$ "=" |-- Parse.typ) -- | 
| 
2377d246a631
Quotient package now uses Partial Equivalence instead place of equivalence
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: 
36960diff
changeset | 297 | (Parse.$$$ "/" |-- (partial -- Parse.term))) | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 298 | |
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36323diff
changeset | 299 | val _ = Keyword.keyword "/" | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 300 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 301 | val _ = | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36323diff
changeset | 302 | Outer_Syntax.local_theory_to_proof "quotient_type" | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 303 | "quotient type definitions (require equivalence proofs)" | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36323diff
changeset | 304 | Keyword.thy_goal (quotspec_parser >> quotient_type_cmd) | 
| 35222 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 305 | |
| 
4f1fba00f66d
Initial version of HOL quotient package.
 Cezary Kaliszyk <kaliszyk@in.tum.de> parents: diff
changeset | 306 | end; (* structure *) |