| author | wenzelm | 
| Thu, 08 Dec 2022 22:38:03 +0100 | |
| changeset 76610 | 6e2383488a55 | 
| parent 74282 | c2ee8d993d6a | 
| child 77902 | 01d6b2a44df8 | 
| permissions | -rw-r--r-- | 
| 21476 | 1 | (* Title: Pure/morphism.ML | 
| 2 | Author: Makarius | |
| 3 | ||
| 4 | Abstract morphisms on formal entities. | |
| 5 | *) | |
| 6 | ||
| 7 | infix 1 $> | |
| 8 | ||
| 9 | signature BASIC_MORPHISM = | |
| 10 | sig | |
| 11 | type morphism | |
| 24031 | 12 | type declaration = morphism -> Context.generic -> Context.generic | 
| 21476 | 13 | val $> : morphism * morphism -> morphism | 
| 14 | end | |
| 15 | ||
| 16 | signature MORPHISM = | |
| 17 | sig | |
| 18 | include BASIC_MORPHISM | |
| 54740 | 19 | exception MORPHISM of string * exn | 
| 67650 | 20 | val morphism: string -> | 
| 21 |    {binding: (binding -> binding) list,
 | |
| 22 | typ: (typ -> typ) list, | |
| 23 | term: (term -> term) list, | |
| 24 | fact: (thm list -> thm list) list} -> morphism | |
| 54740 | 25 | val pretty: morphism -> Pretty.T | 
| 29581 | 26 | val binding: morphism -> binding -> binding | 
| 69062 | 27 | val binding_prefix: morphism -> (string * bool) list | 
| 21476 | 28 | val typ: morphism -> typ -> typ | 
| 29 | val term: morphism -> term -> term | |
| 21521 | 30 | val fact: morphism -> thm list -> thm list | 
| 21476 | 31 | val thm: morphism -> thm -> thm | 
| 22235 | 32 | val cterm: morphism -> cterm -> cterm | 
| 67650 | 33 | val identity: morphism | 
| 34 | val compose: morphism -> morphism -> morphism | |
| 35 | val transform: morphism -> (morphism -> 'a) -> morphism -> 'a | |
| 36 | val form: (morphism -> 'a) -> 'a | |
| 54740 | 37 | val binding_morphism: string -> (binding -> binding) -> morphism | 
| 38 | val typ_morphism: string -> (typ -> typ) -> morphism | |
| 39 | val term_morphism: string -> (term -> term) -> morphism | |
| 40 | val fact_morphism: string -> (thm list -> thm list) -> morphism | |
| 41 | val thm_morphism: string -> (thm -> thm) -> morphism | |
| 53087 | 42 | val transfer_morphism: theory -> morphism | 
| 67664 | 43 | val transfer_morphism': Proof.context -> morphism | 
| 44 | val transfer_morphism'': Context.generic -> morphism | |
| 61064 | 45 | val trim_context_morphism: morphism | 
| 74282 | 46 | val instantiate_frees_morphism: ctyp TFrees.table * cterm Frees.table -> morphism | 
| 47 | val instantiate_morphism: ctyp TVars.table * cterm Vars.table -> morphism | |
| 21476 | 48 | end; | 
| 49 | ||
| 50 | structure Morphism: MORPHISM = | |
| 51 | struct | |
| 52 | ||
| 54740 | 53 | (* named functions *) | 
| 54 | ||
| 55 | type 'a funs = (string * ('a -> 'a)) list;
 | |
| 56 | ||
| 57 | exception MORPHISM of string * exn; | |
| 58 | ||
| 59 | fun app (name, f) x = f x | |
| 62505 | 60 | handle exn => | 
| 61 | if Exn.is_interrupt exn then Exn.reraise exn else raise MORPHISM (name, exn); | |
| 54740 | 62 | |
| 63 | fun apply fs = fold_rev app fs; | |
| 64 | ||
| 65 | ||
| 66 | (* type morphism *) | |
| 45289 
25e9e7f527b4
slightly more explicit/syntactic modelling of morphisms;
 wenzelm parents: 
37216diff
changeset | 67 | |
| 21476 | 68 | datatype morphism = Morphism of | 
| 54740 | 69 |  {names: string list,
 | 
| 70 | binding: binding funs, | |
| 45289 
25e9e7f527b4
slightly more explicit/syntactic modelling of morphisms;
 wenzelm parents: 
37216diff
changeset | 71 | typ: typ funs, | 
| 
25e9e7f527b4
slightly more explicit/syntactic modelling of morphisms;
 wenzelm parents: 
37216diff
changeset | 72 | term: term funs, | 
| 
25e9e7f527b4
slightly more explicit/syntactic modelling of morphisms;
 wenzelm parents: 
37216diff
changeset | 73 | fact: thm list funs}; | 
| 21476 | 74 | |
| 24031 | 75 | type declaration = morphism -> Context.generic -> Context.generic; | 
| 76 | ||
| 67650 | 77 | fun morphism a {binding, typ, term, fact} =
 | 
| 78 |   Morphism {
 | |
| 79 | names = if a = "" then [] else [a], | |
| 80 | binding = map (pair a) binding, | |
| 81 | typ = map (pair a) typ, | |
| 82 | term = map (pair a) term, | |
| 83 | fact = map (pair a) fact}; | |
| 84 | ||
| 54740 | 85 | fun pretty (Morphism {names, ...}) = Pretty.enum ";" "{" "}" (map Pretty.str (rev names));
 | 
| 86 | ||
| 62819 
d3ff367a16a0
careful export of type-dependent functions, without losing their special status;
 wenzelm parents: 
62663diff
changeset | 87 | val _ = ML_system_pp (fn _ => fn _ => Pretty.to_polyml o pretty); | 
| 62663 | 88 | |
| 45289 
25e9e7f527b4
slightly more explicit/syntactic modelling of morphisms;
 wenzelm parents: 
37216diff
changeset | 89 | fun binding (Morphism {binding, ...}) = apply binding;
 | 
| 69062 | 90 | fun binding_prefix morph = Binding.name "x" |> binding morph |> Binding.prefix_of; | 
| 45289 
25e9e7f527b4
slightly more explicit/syntactic modelling of morphisms;
 wenzelm parents: 
37216diff
changeset | 91 | fun typ (Morphism {typ, ...}) = apply typ;
 | 
| 
25e9e7f527b4
slightly more explicit/syntactic modelling of morphisms;
 wenzelm parents: 
37216diff
changeset | 92 | fun term (Morphism {term, ...}) = apply term;
 | 
| 
25e9e7f527b4
slightly more explicit/syntactic modelling of morphisms;
 wenzelm parents: 
37216diff
changeset | 93 | fun fact (Morphism {fact, ...}) = apply fact;
 | 
| 21521 | 94 | val thm = singleton o fact; | 
| 22235 | 95 | val cterm = Drule.cterm_rule o thm; | 
| 21476 | 96 | |
| 54740 | 97 | |
| 67650 | 98 | (* morphism combinators *) | 
| 21492 | 99 | |
| 54740 | 100 | val identity = morphism "" {binding = [], typ = [], term = [], fact = []};
 | 
| 101 | ||
| 22571 
3f00e937d1c9
renamed comp to compose (avoid clash with Alice keywords);
 wenzelm parents: 
22235diff
changeset | 102 | fun compose | 
| 54740 | 103 |     (Morphism {names = names1, binding = binding1, typ = typ1, term = term1, fact = fact1})
 | 
| 104 |     (Morphism {names = names2, binding = binding2, typ = typ2, term = term2, fact = fact2}) =
 | |
| 105 |   Morphism {
 | |
| 106 | names = names1 @ names2, | |
| 107 | binding = binding1 @ binding2, | |
| 108 | typ = typ1 @ typ2, | |
| 109 | term = term1 @ term2, | |
| 110 | fact = fact1 @ fact2}; | |
| 21476 | 111 | |
| 22571 
3f00e937d1c9
renamed comp to compose (avoid clash with Alice keywords);
 wenzelm parents: 
22235diff
changeset | 112 | fun phi1 $> phi2 = compose phi2 phi1; | 
| 21476 | 113 | |
| 22670 
c803b2696ada
added Morphism.transform/form (generic non-sense);
 wenzelm parents: 
22571diff
changeset | 114 | fun transform phi f = fn psi => f (phi $> psi); | 
| 
c803b2696ada
added Morphism.transform/form (generic non-sense);
 wenzelm parents: 
22571diff
changeset | 115 | fun form f = f identity; | 
| 
c803b2696ada
added Morphism.transform/form (generic non-sense);
 wenzelm parents: 
22571diff
changeset | 116 | |
| 67650 | 117 | |
| 118 | (* concrete morphisms *) | |
| 119 | ||
| 120 | fun binding_morphism a binding = morphism a {binding = [binding], typ = [], term = [], fact = []};
 | |
| 121 | fun typ_morphism a typ = morphism a {binding = [], typ = [typ], term = [], fact = []};
 | |
| 122 | fun term_morphism a term = morphism a {binding = [], typ = [], term = [term], fact = []};
 | |
| 123 | fun fact_morphism a fact = morphism a {binding = [], typ = [], term = [], fact = [fact]};
 | |
| 124 | fun thm_morphism a thm = morphism a {binding = [], typ = [], term = [], fact = [map thm]};
 | |
| 125 | ||
| 70310 
c82f59c47aaf
clarified transfer_morphism: implicit join_certificate, e.g. relevant for complex cascades of morphisms such as class locale interpretation;
 wenzelm parents: 
69062diff
changeset | 126 | val transfer_morphism = thm_morphism "transfer" o Thm.join_transfer; | 
| 67664 | 127 | val transfer_morphism' = transfer_morphism o Proof_Context.theory_of; | 
| 128 | val transfer_morphism'' = transfer_morphism o Context.theory_of; | |
| 129 | ||
| 67650 | 130 | val trim_context_morphism = thm_morphism "trim_context" Thm.trim_context; | 
| 131 | ||
| 67698 
67caf783b9ee
explicit operations to instantiate frees: typ, term, thm, morphism;
 wenzelm parents: 
67664diff
changeset | 132 | |
| 
67caf783b9ee
explicit operations to instantiate frees: typ, term, thm, morphism;
 wenzelm parents: 
67664diff
changeset | 133 | (* instantiate *) | 
| 
67caf783b9ee
explicit operations to instantiate frees: typ, term, thm, morphism;
 wenzelm parents: 
67664diff
changeset | 134 | |
| 74282 | 135 | fun instantiate_frees_morphism (cinstT, cinst) = | 
| 136 | if TFrees.is_empty cinstT andalso Frees.is_empty cinst then identity | |
| 137 | else | |
| 138 | let | |
| 139 | val instT = TFrees.map (K Thm.typ_of) cinstT; | |
| 140 | val inst = Frees.map (K Thm.term_of) cinst; | |
| 141 | in | |
| 142 | morphism "instantiate_frees" | |
| 143 |         {binding = [],
 | |
| 144 | typ = | |
| 145 | if TFrees.is_empty instT then [] | |
| 146 | else [Term_Subst.instantiateT_frees instT], | |
| 147 | term = [Term_Subst.instantiate_frees (instT, inst)], | |
| 148 | fact = [map (Thm.instantiate_frees (cinstT, cinst))]} | |
| 149 | end; | |
| 67698 
67caf783b9ee
explicit operations to instantiate frees: typ, term, thm, morphism;
 wenzelm parents: 
67664diff
changeset | 150 | |
| 74282 | 151 | fun instantiate_morphism (cinstT, cinst) = | 
| 152 | if TVars.is_empty cinstT andalso Vars.is_empty cinst then identity | |
| 153 | else | |
| 154 | let | |
| 155 | val instT = TVars.map (K Thm.typ_of) cinstT; | |
| 156 | val inst = Vars.map (K Thm.term_of) cinst; | |
| 157 | in | |
| 158 | morphism "instantiate" | |
| 159 |         {binding = [],
 | |
| 160 | typ = | |
| 161 | if TVars.is_empty instT then [] | |
| 162 | else [Term_Subst.instantiateT instT], | |
| 163 | term = [Term_Subst.instantiate (instT, inst)], | |
| 164 | fact = [map (Thm.instantiate (cinstT, cinst))]} | |
| 165 | end; | |
| 67651 
6dd41193a72a
more explicit instantiate_morphism (without checks for typ / term component);
 wenzelm parents: 
67650diff
changeset | 166 | |
| 21476 | 167 | end; | 
| 168 | ||
| 37216 
3165bc303f66
modernized some structure names, keeping a few legacy aliases;
 wenzelm parents: 
29605diff
changeset | 169 | structure Basic_Morphism: BASIC_MORPHISM = Morphism; | 
| 
3165bc303f66
modernized some structure names, keeping a few legacy aliases;
 wenzelm parents: 
29605diff
changeset | 170 | open Basic_Morphism; |