| author | wenzelm | 
| Sat, 11 Nov 2023 22:17:14 +0100 | |
| changeset 78954 | db9dba720ac7 | 
| parent 78604 | 9ccd5e8737cb | 
| permissions | -rw-r--r-- | 
| 68171 | 1 | /* Title: Pure/Thy/export_theory.scala | 
| 2 | Author: Makarius | |
| 3 | ||
| 4 | Export foundational theory content. | |
| 5 | */ | |
| 6 | ||
| 7 | package isabelle | |
| 8 | ||
| 9 | ||
| 71015 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 10 | import scala.collection.immutable.SortedMap | 
| 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 11 | |
| 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 12 | |
| 75393 | 13 | object Export_Theory {
 | 
| 68206 | 14 | /** session content **/ | 
| 15 | ||
| 75393 | 16 |   sealed case class Session(name: String, theory_graph: Graph[String, Option[Theory]]) {
 | 
| 68206 | 17 | override def toString: String = name | 
| 18 | ||
| 70789 | 19 | def theory(theory_name: String): Option[Theory] = | 
| 68206 | 20 | if (theory_graph.defined(theory_name)) theory_graph.get_node(theory_name) | 
| 70789 | 21 | else None | 
| 68206 | 22 | |
| 23 | def theories: List[Theory] = | |
| 71601 | 24 | theory_graph.topological_order.flatMap(theory) | 
| 68206 | 25 | } | 
| 26 | ||
| 70790 
73514ccad7a6
clarified signature: read full session requirements;
 wenzelm parents: 
70789diff
changeset | 27 | def read_session( | 
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 28 | session_context: Export.Session_Context, | 
| 75862 | 29 | session_stack: Boolean = false, | 
| 75790 
0ab8a9177e41
clarified signature: more uniform treatment of cache for Export.read_session vs. Export.read_theory;
 wenzelm parents: 
75774diff
changeset | 30 | progress: Progress = new Progress | 
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 31 |   ): Session = {
 | 
| 68206 | 32 | val thys = | 
| 75862 | 33 |       for (theory <- theory_names(session_context, session_stack = session_stack)) yield {
 | 
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 34 |         progress.echo("Reading theory " + theory)
 | 
| 75790 
0ab8a9177e41
clarified signature: more uniform treatment of cache for Export.read_session vs. Export.read_theory;
 wenzelm parents: 
75774diff
changeset | 35 | read_theory(session_context.theory(theory)) | 
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 36 | } | 
| 68206 | 37 | |
| 38 | val graph0 = | |
| 73359 | 39 |       thys.foldLeft(Graph.string[Option[Theory]]) {
 | 
| 40 | case (g, thy) => g.default_node(thy.name, Some(thy)) | |
| 41 | } | |
| 68206 | 42 | val graph1 = | 
| 73359 | 43 |       thys.foldLeft(graph0) {
 | 
| 44 | case (g0, thy) => | |
| 45 |           thy.parents.foldLeft(g0) {
 | |
| 46 | case (g1, parent) => g1.default_node(parent, None).add_edge_acyclic(parent, thy.name) | |
| 47 | } | |
| 48 | } | |
| 68206 | 49 | |
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 50 | Session(session_context.session_name, graph1) | 
| 68206 | 51 | } | 
| 52 | ||
| 53 | ||
| 54 | ||
| 68203 | 55 | /** theory content **/ | 
| 56 | ||
| 68208 | 57 | sealed case class Theory(name: String, parents: List[String], | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 58 | types: List[Entity[Type]], | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 59 | consts: List[Entity[Const]], | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 60 | axioms: List[Entity[Axiom]], | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 61 | thms: List[Entity[Thm]], | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 62 | classes: List[Entity[Class]], | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 63 | locales: List[Entity[Locale]], | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 64 | locale_dependencies: List[Entity[Locale_Dependency]], | 
| 68295 | 65 | classrel: List[Classrel], | 
| 68862 | 66 | arities: List[Arity], | 
| 70920 | 67 | constdefs: List[Constdef], | 
| 71202 | 68 | typedefs: List[Typedef], | 
| 71248 | 69 | datatypes: List[Datatype], | 
| 74261 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 70 | spec_rules: List[Spec_Rule], | 
| 75393 | 71 | others: Map[String, List[Entity[Other]]] | 
| 72 |   ) {
 | |
| 68206 | 73 | override def toString: String = name | 
| 68267 | 74 | |
| 75726 | 75 | def entity_iterator: Iterator[Entity0] = | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 76 | types.iterator.map(_.no_content) ++ | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 77 | consts.iterator.map(_.no_content) ++ | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 78 | axioms.iterator.map(_.no_content) ++ | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 79 | thms.iterator.map(_.no_content) ++ | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 80 | classes.iterator.map(_.no_content) ++ | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 81 | locales.iterator.map(_.no_content) ++ | 
| 74261 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 82 | locale_dependencies.iterator.map(_.no_content) ++ | 
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 83 |       (for { (_, xs) <- others; x <- xs.iterator } yield x.no_content)
 | 
| 68711 | 84 | |
| 68267 | 85 | def cache(cache: Term.Cache): Theory = | 
| 86 | Theory(cache.string(name), | |
| 73866 | 87 | parents.map(cache.string), | 
| 68267 | 88 | types.map(_.cache(cache)), | 
| 89 | consts.map(_.cache(cache)), | |
| 90 | axioms.map(_.cache(cache)), | |
| 70579 
5a8e3e4b3760
clarified export of axioms and theorems (identified derivations instead of projected facts);
 wenzelm parents: 
70539diff
changeset | 91 | thms.map(_.cache(cache)), | 
| 68267 | 92 | classes.map(_.cache(cache)), | 
| 68862 | 93 | locales.map(_.cache(cache)), | 
| 69069 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 94 | locale_dependencies.map(_.cache(cache)), | 
| 68295 | 95 | classrel.map(_.cache(cache)), | 
| 68862 | 96 | arities.map(_.cache(cache)), | 
| 70920 | 97 | constdefs.map(_.cache(cache)), | 
| 71202 | 98 | typedefs.map(_.cache(cache)), | 
| 71248 | 99 | datatypes.map(_.cache(cache)), | 
| 74261 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 100 | spec_rules.map(_.cache(cache)), | 
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 101 | (for ((k, xs) <- others.iterator) yield cache.string(k) -> xs.map(_.cache(cache))).toMap) | 
| 68206 | 102 | } | 
| 103 | ||
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 104 | def read_theory_parents(theory_context: Export.Theory_Context): Option[List[String]] = | 
| 75860 
2b2c09f4e7b5
proper export theory_names: theory/parents are not necessarily present (amending 4d27b520622a);
 wenzelm parents: 
75790diff
changeset | 105 | theory_context.get(Export.THEORY_PREFIX + "parents") | 
| 76853 | 106 | .map(entry => Library.trim_split_lines(entry.text)) | 
| 74688 | 107 | |
| 75862 | 108 | def theory_names( | 
| 109 | session_context: Export.Session_Context, | |
| 110 | session_stack: Boolean = false | |
| 111 |   ): List[String] = {
 | |
| 112 | val session = if (session_stack) "" else session_context.session_name | |
| 75861 | 113 |     for {
 | 
| 75862 | 114 | theory <- session_context.theory_names(session = session) | 
| 75861 | 115 | if read_theory_parents(session_context.theory(theory)).isDefined | 
| 116 | } yield theory | |
| 75862 | 117 | } | 
| 75861 | 118 | |
| 74694 
2d9d92116fac
clarified Theory_Cache: prefer immutable data with Synchronized variable;
 wenzelm parents: 
74688diff
changeset | 119 | def no_theory: Theory = | 
| 
2d9d92116fac
clarified Theory_Cache: prefer immutable data with Synchronized variable;
 wenzelm parents: 
74688diff
changeset | 120 |     Theory("", Nil, Nil, Nil, Nil, Nil, Nil, Nil, Nil, Nil, Nil, Nil, Nil, Nil, Nil, Map.empty)
 | 
| 
2d9d92116fac
clarified Theory_Cache: prefer immutable data with Synchronized variable;
 wenzelm parents: 
74688diff
changeset | 121 | |
| 75393 | 122 | def read_theory( | 
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 123 | theory_context: Export.Theory_Context, | 
| 75790 
0ab8a9177e41
clarified signature: more uniform treatment of cache for Export.read_session vs. Export.read_theory;
 wenzelm parents: 
75774diff
changeset | 124 | permissive: Boolean = false | 
| 75393 | 125 |   ): Theory = {
 | 
| 75790 
0ab8a9177e41
clarified signature: more uniform treatment of cache for Export.read_session vs. Export.read_theory;
 wenzelm parents: 
75774diff
changeset | 126 | val cache = theory_context.cache | 
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 127 | val session_name = theory_context.session_context.session_name | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 128 | val theory_name = theory_context.theory | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 129 |     read_theory_parents(theory_context) match {
 | 
| 75747 | 130 | case None if permissive => no_theory | 
| 131 | case None => | |
| 74688 | 132 |         error("Missing theory export in session " + quote(session_name) + ": " + quote(theory_name))
 | 
| 75747 | 133 | case Some(parents) => | 
| 134 | val theory = | |
| 135 | Theory(theory_name, parents, | |
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 136 | read_types(theory_context), | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 137 | read_consts(theory_context), | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 138 | read_axioms(theory_context), | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 139 | read_thms(theory_context), | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 140 | read_classes(theory_context), | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 141 | read_locales(theory_context), | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 142 | read_locale_dependencies(theory_context), | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 143 | read_classrel(theory_context), | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 144 | read_arities(theory_context), | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 145 | read_constdefs(theory_context), | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 146 | read_typedefs(theory_context), | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 147 | read_datatypes(theory_context), | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 148 | read_spec_rules(theory_context), | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 149 | read_others(theory_context)) | 
| 75747 | 150 | if (cache.no_cache) theory else theory.cache(cache) | 
| 151 | } | |
| 68203 | 152 | } | 
| 153 | ||
| 154 | ||
| 68171 | 155 | /* entities */ | 
| 156 | ||
| 75393 | 157 |   object Kind {
 | 
| 74261 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 158 | val TYPE = "type" | 
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 159 | val CONST = "const" | 
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 160 | val THM = "thm" | 
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 161 | val PROOF = "proof" | 
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 162 | val LOCALE_DEPENDENCY = "locale_dependency" | 
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 163 | val DOCUMENT_HEADING = "document_heading" | 
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 164 | val DOCUMENT_TEXT = "document_text" | 
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 165 | val PROOF_TEXT = "proof_text" | 
| 68714 | 166 | } | 
| 167 | ||
| 74261 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 168 | def export_kind(kind: String): String = | 
| 74681 
84e5b4339db6
tuned -- eliminate clones stemming from d28a51dd9da6;
 wenzelm parents: 
74657diff
changeset | 169 | if (kind == Markup.TYPE_NAME) Kind.TYPE | 
| 
84e5b4339db6
tuned -- eliminate clones stemming from d28a51dd9da6;
 wenzelm parents: 
74657diff
changeset | 170 | else if (kind == Markup.CONSTANT) Kind.CONST | 
| 74261 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 171 | else kind | 
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 172 | |
| 74694 
2d9d92116fac
clarified Theory_Cache: prefer immutable data with Synchronized variable;
 wenzelm parents: 
74688diff
changeset | 173 | def export_kind_name(kind: String, name: String): String = | 
| 
2d9d92116fac
clarified Theory_Cache: prefer immutable data with Synchronized variable;
 wenzelm parents: 
74688diff
changeset | 174 | name + "|" + export_kind(kind) | 
| 
2d9d92116fac
clarified Theory_Cache: prefer immutable data with Synchronized variable;
 wenzelm parents: 
74688diff
changeset | 175 | |
| 75393 | 176 |   abstract class Content[T] {
 | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 177 | def cache(cache: Term.Cache): T | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 178 | } | 
| 75393 | 179 |   sealed case class No_Content() extends Content[No_Content] {
 | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 180 | def cache(cache: Term.Cache): No_Content = this | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 181 | } | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 182 | sealed case class Entity[A <: Content[A]]( | 
| 74261 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 183 | kind: String, | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 184 | name: String, | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 185 | xname: String, | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 186 | pos: Position.T, | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 187 | id: Option[Long], | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 188 | serial: Long, | 
| 75393 | 189 | content: Option[A] | 
| 190 |   ) {
 | |
| 74694 
2d9d92116fac
clarified Theory_Cache: prefer immutable data with Synchronized variable;
 wenzelm parents: 
74688diff
changeset | 191 | val kname: String = export_kind_name(kind, name) | 
| 
2d9d92116fac
clarified Theory_Cache: prefer immutable data with Synchronized variable;
 wenzelm parents: 
74688diff
changeset | 192 | val range: Symbol.Range = Position.Range.unapply(pos).getOrElse(Text.Range.offside) | 
| 75905 
2ee3ea69e8f1
clarified Presentation.Nodes, with explicit Nodes.Session and Nodes.Theory;
 wenzelm parents: 
75862diff
changeset | 193 |     val file: String = Position.File.unapply(pos).getOrElse("")
 | 
| 74694 
2d9d92116fac
clarified Theory_Cache: prefer immutable data with Synchronized variable;
 wenzelm parents: 
74688diff
changeset | 194 | |
| 74681 
84e5b4339db6
tuned -- eliminate clones stemming from d28a51dd9da6;
 wenzelm parents: 
74657diff
changeset | 195 | def export_kind: String = Export_Theory.export_kind(kind) | 
| 74261 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 196 | override def toString: String = export_kind + " " + quote(name) | 
| 68267 | 197 | |
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 198 | def the_content: A = | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 199 |       if (content.isDefined) content.get else error("No content for " + toString)
 | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 200 | |
| 75726 | 201 | def no_content: Entity0 = copy(content = None) | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 202 | |
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 203 | def cache(cache: Term.Cache): Entity[A] = | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 204 | Entity( | 
| 74261 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 205 | cache.string(kind), | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 206 | cache.string(name), | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 207 | cache.string(xname), | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 208 | cache.position(pos), | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 209 | id, | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 210 | serial, | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 211 | content.map(_.cache(cache))) | 
| 68171 | 212 | } | 
| 75726 | 213 | type Entity0 = Entity[No_Content] | 
| 68171 | 214 | |
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 215 | def read_entities[A <: Content[A]]( | 
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 216 | theory_context: Export.Theory_Context, | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 217 | export_name: String, | 
| 74261 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 218 | kind: String, | 
| 75393 | 219 | decode: XML.Decode.T[A] | 
| 220 |   ): List[Entity[A]] = {
 | |
| 221 |     def decode_entity(tree: XML.Tree): Entity[A] = {
 | |
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 222 | def err(): Nothing = throw new XML.XML_Body(List(tree)) | 
| 68171 | 223 | |
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 224 |       tree match {
 | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 225 | case XML.Elem(Markup(Markup.ENTITY, props), body) => | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 226 | val name = Markup.Name.unapply(props) getOrElse err() | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 227 | val xname = Markup.XName.unapply(props) getOrElse err() | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 228 | val pos = props.filter(p => Markup.position_property(p) && p._1 != Markup.ID) | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 229 | val id = Position.Id.unapply(props) | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 230 | val serial = Markup.Serial.unapply(props) getOrElse err() | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 231 | val content = if (body.isEmpty) None else Some(decode(body)) | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 232 | Entity(kind, name, xname, pos, id, serial, content) | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 233 | case _ => err() | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 234 | } | 
| 68171 | 235 | } | 
| 76854 | 236 | theory_context.yxml(export_name).map(decode_entity) | 
| 68171 | 237 | } | 
| 238 | ||
| 239 | ||
| 69077 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69076diff
changeset | 240 | /* approximative syntax */ | 
| 69003 | 241 | |
| 78604 | 242 |   enum Assoc { case NO_ASSOC, LEFT_ASSOC, RIGHT_ASSOC }
 | 
| 69003 | 243 | |
| 69077 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69076diff
changeset | 244 | sealed abstract class Syntax | 
| 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69076diff
changeset | 245 | case object No_Syntax extends Syntax | 
| 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69076diff
changeset | 246 | case class Prefix(delim: String) extends Syntax | 
| 78604 | 247 | case class Infix(assoc: Assoc, delim: String, pri: Int) extends Syntax | 
| 69003 | 248 | |
| 69077 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69076diff
changeset | 249 | def decode_syntax: XML.Decode.T[Syntax] = | 
| 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69076diff
changeset | 250 | XML.Decode.variant(List( | 
| 75436 | 251 |       { case (Nil, Nil) => No_Syntax },
 | 
| 252 |       { case (List(delim), Nil) => Prefix(delim) },
 | |
| 69077 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69076diff
changeset | 253 |       { case (Nil, body) =>
 | 
| 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69076diff
changeset | 254 | import XML.Decode._ | 
| 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69076diff
changeset | 255 | val (ass, delim, pri) = triple(int, string, int)(body) | 
| 78604 | 256 | Infix(Assoc.fromOrdinal(ass), delim, pri) })) | 
| 69003 | 257 | |
| 258 | ||
| 68171 | 259 | /* types */ | 
| 260 | ||
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 261 | sealed case class Type(syntax: Syntax, args: List[String], abbrev: Option[Term.Typ]) | 
| 75393 | 262 |   extends Content[Type] {
 | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 263 | override def cache(cache: Term.Cache): Type = | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 264 | Type( | 
| 69003 | 265 | syntax, | 
| 73866 | 266 | args.map(cache.string), | 
| 267 | abbrev.map(cache.typ)) | |
| 68267 | 268 | } | 
| 68171 | 269 | |
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 270 | def read_types(theory_context: Export.Theory_Context): List[Entity[Type]] = | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 271 | read_entities(theory_context, Export.THEORY_PREFIX + "types", Markup.TYPE_NAME, | 
| 75394 | 272 |       { body =>
 | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 273 | import XML.Decode._ | 
| 69003 | 274 | val (syntax, args, abbrev) = | 
| 69077 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69076diff
changeset | 275 | triple(decode_syntax, list(string), option(Term_XML.Decode.typ))(body) | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 276 | Type(syntax, args, abbrev) | 
| 68418 | 277 | }) | 
| 68171 | 278 | |
| 279 | ||
| 280 | /* consts */ | |
| 281 | ||
| 68173 | 282 | sealed case class Const( | 
| 69077 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69076diff
changeset | 283 | syntax: Syntax, | 
| 69003 | 284 | typargs: List[String], | 
| 285 | typ: Term.Typ, | |
| 69988 | 286 | abbrev: Option[Term.Term], | 
| 75393 | 287 | propositional: Boolean | 
| 288 |   ) extends Content[Const] {
 | |
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 289 | override def cache(cache: Term.Cache): Const = | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 290 | Const( | 
| 69003 | 291 | syntax, | 
| 73866 | 292 | typargs.map(cache.string), | 
| 68267 | 293 | cache.typ(typ), | 
| 73866 | 294 | abbrev.map(cache.term), | 
| 71222 
2bc39c80a95d
clarified export of consts: recursion is accessible via spec_rules;
 wenzelm parents: 
71211diff
changeset | 295 | propositional) | 
| 68267 | 296 | } | 
| 68171 | 297 | |
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 298 | def read_consts(theory_context: Export.Theory_Context): List[Entity[Const]] = | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 299 | read_entities(theory_context, Export.THEORY_PREFIX + "consts", Markup.CONSTANT, | 
| 75394 | 300 |       { body =>
 | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 301 | import XML.Decode._ | 
| 71222 
2bc39c80a95d
clarified export of consts: recursion is accessible via spec_rules;
 wenzelm parents: 
71211diff
changeset | 302 | val (syntax, (typargs, (typ, (abbrev, propositional)))) = | 
| 69992 
bd3c10813cc4
more informative Spec_Rules.Equational, notably primrec argument types;
 wenzelm parents: 
69988diff
changeset | 303 | pair(decode_syntax, | 
| 
bd3c10813cc4
more informative Spec_Rules.Equational, notably primrec argument types;
 wenzelm parents: 
69988diff
changeset | 304 | pair(list(string), | 
| 
bd3c10813cc4
more informative Spec_Rules.Equational, notably primrec argument types;
 wenzelm parents: 
69988diff
changeset | 305 | pair(Term_XML.Decode.typ, | 
| 71222 
2bc39c80a95d
clarified export of consts: recursion is accessible via spec_rules;
 wenzelm parents: 
71211diff
changeset | 306 | pair(option(Term_XML.Decode.term), bool))))(body) | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 307 | Const(syntax, typargs, typ, abbrev, propositional) | 
| 68418 | 308 | }) | 
| 68208 | 309 | |
| 310 | ||
| 70579 
5a8e3e4b3760
clarified export of axioms and theorems (identified derivations instead of projected facts);
 wenzelm parents: 
70539diff
changeset | 311 | /* axioms */ | 
| 68232 | 312 | |
| 68726 | 313 | sealed case class Prop( | 
| 314 | typargs: List[(String, Term.Sort)], | |
| 315 | args: List[(String, Term.Typ)], | |
| 75393 | 316 | term: Term.Term | 
| 317 |   ) extends Content[Prop] {
 | |
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 318 | override def cache(cache: Term.Cache): Prop = | 
| 68726 | 319 | Prop( | 
| 320 |         typargs.map({ case (name, sort) => (cache.string(name), cache.sort(sort)) }),
 | |
| 321 |         args.map({ case (name, typ) => (cache.string(name), cache.typ(typ)) }),
 | |
| 322 | cache.term(term)) | |
| 68232 | 323 | } | 
| 68208 | 324 | |
| 75393 | 325 |   def decode_prop(body: XML.Body): Prop = {
 | 
| 326 |     val (typargs, args, t) = {
 | |
| 68726 | 327 | import XML.Decode._ | 
| 328 | import Term_XML.Decode._ | |
| 329 | triple(list(pair(string, sort)), list(pair(string, typ)), term)(body) | |
| 330 | } | |
| 331 | Prop(typargs, args, t) | |
| 68267 | 332 | } | 
| 68208 | 333 | |
| 75393 | 334 |   sealed case class Axiom(prop: Prop) extends Content[Axiom] {
 | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 335 | override def cache(cache: Term.Cache): Axiom = Axiom(prop.cache(cache)) | 
| 70534 
fb876ebbf5a7
export facts with reconstructed proof term (if possible), but its PThm boxes need to be collected separately;
 wenzelm parents: 
70384diff
changeset | 336 | } | 
| 
fb876ebbf5a7
export facts with reconstructed proof term (if possible), but its PThm boxes need to be collected separately;
 wenzelm parents: 
70384diff
changeset | 337 | |
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 338 | def read_axioms(theory_context: Export.Theory_Context): List[Entity[Axiom]] = | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 339 | read_entities(theory_context, Export.THEORY_PREFIX + "axioms", Markup.AXIOM, | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 340 | body => Axiom(decode_prop(body))) | 
| 68232 | 341 | |
| 70579 
5a8e3e4b3760
clarified export of axioms and theorems (identified derivations instead of projected facts);
 wenzelm parents: 
70539diff
changeset | 342 | |
| 
5a8e3e4b3760
clarified export of axioms and theorems (identified derivations instead of projected facts);
 wenzelm parents: 
70539diff
changeset | 343 | /* theorems */ | 
| 
5a8e3e4b3760
clarified export of axioms and theorems (identified derivations instead of projected facts);
 wenzelm parents: 
70539diff
changeset | 344 | |
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 345 | sealed case class Thm_Id(serial: Long, theory_name: String) | 
| 70884 | 346 | |
| 347 | sealed case class Thm( | |
| 348 | prop: Prop, | |
| 349 | deps: List[String], | |
| 75393 | 350 | proof: Term.Proof) | 
| 351 |   extends Content[Thm] {
 | |
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 352 | override def cache(cache: Term.Cache): Thm = | 
| 70884 | 353 | Thm( | 
| 354 | prop.cache(cache), | |
| 73866 | 355 | deps.map(cache.string), | 
| 70896 | 356 | cache.proof(proof)) | 
| 70579 
5a8e3e4b3760
clarified export of axioms and theorems (identified derivations instead of projected facts);
 wenzelm parents: 
70539diff
changeset | 357 | } | 
| 
5a8e3e4b3760
clarified export of axioms and theorems (identified derivations instead of projected facts);
 wenzelm parents: 
70539diff
changeset | 358 | |
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 359 | def read_thms(theory_context: Export.Theory_Context): List[Entity[Thm]] = | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 360 | read_entities(theory_context, Export.THEORY_PREFIX + "thms", Kind.THM, | 
| 75394 | 361 |       { body =>
 | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 362 | import XML.Decode._ | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 363 | import Term_XML.Decode._ | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 364 | val (prop, deps, prf) = triple(decode_prop, list(string), proof)(body) | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 365 | Thm(prop, deps, prf) | 
| 68418 | 366 | }) | 
| 68264 | 367 | |
| 70881 | 368 | sealed case class Proof( | 
| 369 | typargs: List[(String, Term.Sort)], | |
| 370 | args: List[(String, Term.Typ)], | |
| 371 | term: Term.Term, | |
| 75393 | 372 | proof: Term.Proof | 
| 373 |   ) {
 | |
| 70883 | 374 | def prop: Prop = Prop(typargs, args, term) | 
| 375 | ||
| 70881 | 376 | def cache(cache: Term.Cache): Proof = | 
| 377 | Proof( | |
| 378 |         typargs.map({ case (name, sort) => (cache.string(name), cache.sort(sort)) }),
 | |
| 379 |         args.map({ case (name, typ) => (cache.string(name), cache.typ(typ)) }),
 | |
| 380 | cache.term(term), | |
| 381 | cache.proof(proof)) | |
| 382 | } | |
| 383 | ||
| 70899 
5f6dea6a7a4c
clarified signature: support partial read_proof to accommodate proof term normalization vs. approximative proof_boxes as upper bound;
 wenzelm parents: 
70896diff
changeset | 384 | def read_proof( | 
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 385 | session_context: Export.Session_Context, | 
| 75393 | 386 | id: Thm_Id, | 
| 75790 
0ab8a9177e41
clarified signature: more uniform treatment of cache for Export.read_session vs. Export.read_theory;
 wenzelm parents: 
75774diff
changeset | 387 | other_cache: Option[Term.Cache] = None | 
| 75393 | 388 |   ): Option[Proof] = {
 | 
| 75790 
0ab8a9177e41
clarified signature: more uniform treatment of cache for Export.read_session vs. Export.read_theory;
 wenzelm parents: 
75774diff
changeset | 389 | val theory_context = session_context.theory(id.theory_name, other_cache = other_cache) | 
| 
0ab8a9177e41
clarified signature: more uniform treatment of cache for Export.read_session vs. Export.read_theory;
 wenzelm parents: 
75774diff
changeset | 390 | val cache = theory_context.cache | 
| 
0ab8a9177e41
clarified signature: more uniform treatment of cache for Export.read_session vs. Export.read_theory;
 wenzelm parents: 
75774diff
changeset | 391 | |
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 392 |     for { entry <- theory_context.get(Export.PROOFS_PREFIX + id.serial) }
 | 
| 70899 
5f6dea6a7a4c
clarified signature: support partial read_proof to accommodate proof term normalization vs. approximative proof_boxes as upper bound;
 wenzelm parents: 
70896diff
changeset | 393 |     yield {
 | 
| 76852 | 394 | val body = entry.yxml | 
| 75393 | 395 |       val (typargs, (args, (prop_body, proof_body))) = {
 | 
| 70899 
5f6dea6a7a4c
clarified signature: support partial read_proof to accommodate proof term normalization vs. approximative proof_boxes as upper bound;
 wenzelm parents: 
70896diff
changeset | 396 | import XML.Decode._ | 
| 
5f6dea6a7a4c
clarified signature: support partial read_proof to accommodate proof term normalization vs. approximative proof_boxes as upper bound;
 wenzelm parents: 
70896diff
changeset | 397 | import Term_XML.Decode._ | 
| 
5f6dea6a7a4c
clarified signature: support partial read_proof to accommodate proof term normalization vs. approximative proof_boxes as upper bound;
 wenzelm parents: 
70896diff
changeset | 398 | pair(list(pair(string, sort)), pair(list(pair(string, typ)), pair(x => x, x => x)))(body) | 
| 
5f6dea6a7a4c
clarified signature: support partial read_proof to accommodate proof term normalization vs. approximative proof_boxes as upper bound;
 wenzelm parents: 
70896diff
changeset | 399 | } | 
| 
5f6dea6a7a4c
clarified signature: support partial read_proof to accommodate proof term normalization vs. approximative proof_boxes as upper bound;
 wenzelm parents: 
70896diff
changeset | 400 | val env = args.toMap | 
| 
5f6dea6a7a4c
clarified signature: support partial read_proof to accommodate proof term normalization vs. approximative proof_boxes as upper bound;
 wenzelm parents: 
70896diff
changeset | 401 | val prop = Term_XML.Decode.term_env(env)(prop_body) | 
| 
5f6dea6a7a4c
clarified signature: support partial read_proof to accommodate proof term normalization vs. approximative proof_boxes as upper bound;
 wenzelm parents: 
70896diff
changeset | 402 | val proof = Term_XML.Decode.proof_env(env)(proof_body) | 
| 70843 
cc987440d776
more compact XML: separate environment for free variables;
 wenzelm parents: 
70790diff
changeset | 403 | |
| 70899 
5f6dea6a7a4c
clarified signature: support partial read_proof to accommodate proof term normalization vs. approximative proof_boxes as upper bound;
 wenzelm parents: 
70896diff
changeset | 404 | val result = Proof(typargs, args, prop, proof) | 
| 73024 | 405 | if (cache.no_cache) result else result.cache(cache) | 
| 70843 
cc987440d776
more compact XML: separate environment for free variables;
 wenzelm parents: 
70790diff
changeset | 406 | } | 
| 70539 
30b3c58a1933
support Export_Theory.read_proof, based on theory_name and serial;
 wenzelm parents: 
70534diff
changeset | 407 | } | 
| 
30b3c58a1933
support Export_Theory.read_proof, based on theory_name and serial;
 wenzelm parents: 
70534diff
changeset | 408 | |
| 71015 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 409 | def read_proof_boxes( | 
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 410 | session_context: Export.Session_Context, | 
| 71015 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 411 | proof: Term.Proof, | 
| 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 412 | suppress: Thm_Id => Boolean = _ => false, | 
| 75790 
0ab8a9177e41
clarified signature: more uniform treatment of cache for Export.read_session vs. Export.read_theory;
 wenzelm parents: 
75774diff
changeset | 413 | other_cache: Option[Term.Cache] = None | 
| 75393 | 414 |   ): List[(Thm_Id, Proof)] = {
 | 
| 71015 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 415 | var seen = Set.empty[Long] | 
| 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 416 | var result = SortedMap.empty[Long, (Thm_Id, Proof)] | 
| 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 417 | |
| 75393 | 418 |     def boxes(context: Option[(Long, Term.Proof)], prf: Term.Proof): Unit = {
 | 
| 71015 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 419 |       prf match {
 | 
| 71016 | 420 | case Term.Abst(_, _, p) => boxes(context, p) | 
| 421 | case Term.AbsP(_, _, p) => boxes(context, p) | |
| 422 | case Term.Appt(p, _) => boxes(context, p) | |
| 423 | case Term.AppP(p, q) => boxes(context, p); boxes(context, q) | |
| 71015 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 424 | case thm: Term.PThm if !seen(thm.serial) => | 
| 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 425 | seen += thm.serial | 
| 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 426 | val id = Thm_Id(thm.serial, thm.theory_name) | 
| 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 427 |           if (!suppress(id)) {
 | 
| 75790 
0ab8a9177e41
clarified signature: more uniform treatment of cache for Export.read_session vs. Export.read_theory;
 wenzelm parents: 
75774diff
changeset | 428 |             Export_Theory.read_proof(session_context, id, other_cache = other_cache) match {
 | 
| 71015 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 429 | case Some(p) => | 
| 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 430 | result += (thm.serial -> (id -> p)) | 
| 71016 | 431 | boxes(Some((thm.serial, p.proof)), p.proof) | 
| 71015 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 432 | case None => | 
| 71016 | 433 |                 error("Missing proof " + thm.serial + " (theory " + quote (thm.theory_name) + ")" +
 | 
| 434 |                   (context match {
 | |
| 435 | case None => "" | |
| 436 | case Some((i, p)) => " in proof " + i + ":\n" + p | |
| 437 | })) | |
| 71015 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 438 | } | 
| 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 439 | } | 
| 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 440 | case _ => | 
| 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 441 | } | 
| 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 442 | } | 
| 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 443 | |
| 71016 | 444 | boxes(None, proof) | 
| 71015 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 445 | result.iterator.map(_._2).toList | 
| 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 446 | } | 
| 
bb49abc2ecbb
determine proof boxes from exported proof (NB: thm_boxes is not sufficient due to OfClass proofs);
 wenzelm parents: 
70920diff
changeset | 447 | |
| 68264 | 448 | |
| 449 | /* type classes */ | |
| 450 | ||
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 451 | sealed case class Class(params: List[(String, Term.Typ)], axioms: List[Prop]) | 
| 75393 | 452 |   extends Content[Class] {
 | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 453 | override def cache(cache: Term.Cache): Class = | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 454 | Class( | 
| 68267 | 455 |         params.map({ case (name, typ) => (cache.string(name), cache.typ(typ)) }),
 | 
| 69023 
cef000855cf4
clarified standardization of variables, with proper treatment of local variables;
 wenzelm parents: 
69019diff
changeset | 456 | axioms.map(_.cache(cache))) | 
| 68267 | 457 | } | 
| 68264 | 458 | |
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 459 | def read_classes(theory_context: Export.Theory_Context): List[Entity[Class]] = | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 460 | read_entities(theory_context, Export.THEORY_PREFIX + "classes", Markup.CLASS, | 
| 75394 | 461 |       { body =>
 | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 462 | import XML.Decode._ | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 463 | import Term_XML.Decode._ | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 464 | val (params, axioms) = pair(list(pair(string, typ)), list(decode_prop))(body) | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 465 | Class(params, axioms) | 
| 68418 | 466 | }) | 
| 68264 | 467 | |
| 468 | ||
| 68862 | 469 | /* locales */ | 
| 470 | ||
| 471 | sealed case class Locale( | |
| 69019 | 472 | typargs: List[(String, Term.Sort)], | 
| 69077 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69076diff
changeset | 473 | args: List[((String, Term.Typ), Syntax)], | 
| 75393 | 474 | axioms: List[Prop] | 
| 475 |   ) extends Content[Locale] {
 | |
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 476 | override def cache(cache: Term.Cache): Locale = | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 477 | Locale( | 
| 68864 | 478 |         typargs.map({ case (name, sort) => (cache.string(name), cache.sort(sort)) }),
 | 
| 69076 | 479 |         args.map({ case ((name, typ), syntax) => ((cache.string(name), cache.typ(typ)), syntax) }),
 | 
| 69023 
cef000855cf4
clarified standardization of variables, with proper treatment of local variables;
 wenzelm parents: 
69019diff
changeset | 480 | axioms.map(_.cache(cache))) | 
| 68862 | 481 | } | 
| 482 | ||
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 483 | def read_locales(theory_context: Export.Theory_Context): List[Entity[Locale]] = | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 484 | read_entities(theory_context, Export.THEORY_PREFIX + "locales", Markup.LOCALE, | 
| 75394 | 485 |       { body =>
 | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 486 | import XML.Decode._ | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 487 | import Term_XML.Decode._ | 
| 69019 | 488 | val (typargs, args, axioms) = | 
| 69077 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69076diff
changeset | 489 | triple(list(pair(string, sort)), list(pair(pair(string, typ), decode_syntax)), | 
| 69076 | 490 | list(decode_prop))(body) | 
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 491 | Locale(typargs, args, axioms) | 
| 68862 | 492 | }) | 
| 493 | ||
| 494 | ||
| 69069 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 495 | /* locale dependencies */ | 
| 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 496 | |
| 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 497 | sealed case class Locale_Dependency( | 
| 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 498 | source: String, | 
| 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 499 | target: String, | 
| 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 500 | prefix: List[(String, Boolean)], | 
| 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 501 | subst_types: List[((String, Term.Sort), Term.Typ)], | 
| 75393 | 502 | subst_terms: List[((String, Term.Typ), Term.Term)] | 
| 503 |   ) extends Content[Locale_Dependency] {
 | |
| 74114 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 504 | override def cache(cache: Term.Cache): Locale_Dependency = | 
| 
700e5bd59c7d
clarified export of formal entities: name space info is always present, but content depends on option "export_theory";
 wenzelm parents: 
73866diff
changeset | 505 | Locale_Dependency( | 
| 69069 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 506 | cache.string(source), | 
| 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 507 | cache.string(target), | 
| 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 508 |         prefix.map({ case (name, mandatory) => (cache.string(name), mandatory) }),
 | 
| 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 509 |         subst_types.map({ case ((a, s), ty) => ((cache.string(a), cache.sort(s)), cache.typ(ty)) }),
 | 
| 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 510 |         subst_terms.map({ case ((x, ty), t) => ((cache.string(x), cache.typ(ty)), cache.term(t)) }))
 | 
| 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 511 | |
| 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 512 | def is_inclusion: Boolean = | 
| 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 513 | subst_types.isEmpty && subst_terms.isEmpty | 
| 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 514 | } | 
| 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 515 | |
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 516 | def read_locale_dependencies( | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 517 | theory_context: Export.Theory_Context | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 518 |   ): List[Entity[Locale_Dependency]] = {
 | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 519 | read_entities(theory_context, Export.THEORY_PREFIX + "locale_dependencies", | 
| 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 520 | Kind.LOCALE_DEPENDENCY, | 
| 75394 | 521 |       { body =>
 | 
| 75393 | 522 | import XML.Decode._ | 
| 523 | import Term_XML.Decode._ | |
| 524 | val (source, (target, (prefix, (subst_types, subst_terms)))) = | |
| 525 | pair(string, pair(string, pair(list(pair(string, bool)), | |
| 526 | pair(list(pair(pair(string, sort), typ)), list(pair(pair(string, typ), term))))))(body) | |
| 527 | Locale_Dependency(source, target, prefix, subst_types, subst_terms) | |
| 528 | }) | |
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 529 | } | 
| 69069 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 530 | |
| 
b9aca3b9619f
export locale dependencies, with approx. morphism as type/term substitution;
 wenzelm parents: 
69023diff
changeset | 531 | |
| 68295 | 532 | /* sort algebra */ | 
| 533 | ||
| 75393 | 534 |   sealed case class Classrel(class1: String, class2: String, prop: Prop) {
 | 
| 68295 | 535 | def cache(cache: Term.Cache): Classrel = | 
| 70384 
8ce08b154aa1
clarified export of sort algebra: avoid logical operations in Isabelle/Scala;
 wenzelm parents: 
69996diff
changeset | 536 | Classrel(cache.string(class1), cache.string(class2), prop.cache(cache)) | 
| 68295 | 537 | } | 
| 538 | ||
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 539 |   def read_classrel(theory_context: Export.Theory_Context): List[Classrel] = {
 | 
| 76854 | 540 | val body = theory_context.yxml(Export.THEORY_PREFIX + "classrel") | 
| 75393 | 541 |     val classrel = {
 | 
| 68418 | 542 | import XML.Decode._ | 
| 70384 
8ce08b154aa1
clarified export of sort algebra: avoid logical operations in Isabelle/Scala;
 wenzelm parents: 
69996diff
changeset | 543 | list(pair(decode_prop, pair(string, string)))(body) | 
| 68418 | 544 | } | 
| 70384 
8ce08b154aa1
clarified export of sort algebra: avoid logical operations in Isabelle/Scala;
 wenzelm parents: 
69996diff
changeset | 545 | for ((prop, (c1, c2)) <- classrel) yield Classrel(c1, c2, prop) | 
| 68418 | 546 | } | 
| 68295 | 547 | |
| 75393 | 548 | sealed case class Arity( | 
| 549 | type_name: String, | |
| 550 | domain: List[Term.Sort], | |
| 551 | codomain: String, | |
| 552 | prop: Prop | |
| 553 |   ) {
 | |
| 68295 | 554 | def cache(cache: Term.Cache): Arity = | 
| 73866 | 555 | Arity(cache.string(type_name), domain.map(cache.sort), cache.string(codomain), | 
| 70384 
8ce08b154aa1
clarified export of sort algebra: avoid logical operations in Isabelle/Scala;
 wenzelm parents: 
69996diff
changeset | 556 | prop.cache(cache)) | 
| 68295 | 557 | } | 
| 558 | ||
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 559 |   def read_arities(theory_context: Export.Theory_Context): List[Arity] = {
 | 
| 76854 | 560 | val body = theory_context.yxml(Export.THEORY_PREFIX + "arities") | 
| 75393 | 561 |     val arities = {
 | 
| 68418 | 562 | import XML.Decode._ | 
| 563 | import Term_XML.Decode._ | |
| 70384 
8ce08b154aa1
clarified export of sort algebra: avoid logical operations in Isabelle/Scala;
 wenzelm parents: 
69996diff
changeset | 564 | list(pair(decode_prop, triple(string, list(sort), string)))(body) | 
| 68418 | 565 | } | 
| 70384 
8ce08b154aa1
clarified export of sort algebra: avoid logical operations in Isabelle/Scala;
 wenzelm parents: 
69996diff
changeset | 566 | for ((prop, (a, b, c)) <- arities) yield Arity(a, b, c, prop) | 
| 68418 | 567 | } | 
| 68295 | 568 | |
| 569 | ||
| 70920 | 570 | /* Pure constdefs */ | 
| 571 | ||
| 75393 | 572 |   sealed case class Constdef(name: String, axiom_name: String) {
 | 
| 70920 | 573 | def cache(cache: Term.Cache): Constdef = | 
| 574 | Constdef(cache.string(name), cache.string(axiom_name)) | |
| 575 | } | |
| 576 | ||
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 577 |   def read_constdefs(theory_context: Export.Theory_Context): List[Constdef] = {
 | 
| 76854 | 578 | val body = theory_context.yxml(Export.THEORY_PREFIX + "constdefs") | 
| 75393 | 579 |     val constdefs = {
 | 
| 70920 | 580 | import XML.Decode._ | 
| 581 | list(pair(string, string))(body) | |
| 582 | } | |
| 583 | for ((name, axiom_name) <- constdefs) yield Constdef(name, axiom_name) | |
| 584 | } | |
| 585 | ||
| 586 | ||
| 68264 | 587 | /* HOL typedefs */ | 
| 588 | ||
| 75393 | 589 | sealed case class Typedef( | 
| 590 | name: String, | |
| 591 | rep_type: Term.Typ, | |
| 592 | abs_type: Term.Typ, | |
| 593 | rep_name: String, | |
| 594 | abs_name: String, | |
| 595 | axiom_name: String | |
| 596 |   ) {
 | |
| 68267 | 597 | def cache(cache: Term.Cache): Typedef = | 
| 598 | Typedef(cache.string(name), | |
| 599 | cache.typ(rep_type), | |
| 600 | cache.typ(abs_type), | |
| 601 | cache.string(rep_name), | |
| 602 | cache.string(abs_name), | |
| 603 | cache.string(axiom_name)) | |
| 604 | } | |
| 68264 | 605 | |
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 606 |   def read_typedefs(theory_context: Export.Theory_Context): List[Typedef] = {
 | 
| 76854 | 607 | val body = theory_context.yxml(Export.THEORY_PREFIX + "typedefs") | 
| 75393 | 608 |     val typedefs = {
 | 
| 68418 | 609 | import XML.Decode._ | 
| 610 | import Term_XML.Decode._ | |
| 611 | list(pair(string, pair(typ, pair(typ, pair(string, pair(string, string))))))(body) | |
| 612 | } | |
| 613 |     for { (name, (rep_type, (abs_type, (rep_name, (abs_name, axiom_name))))) <- typedefs }
 | |
| 614 | yield Typedef(name, rep_type, abs_type, rep_name, abs_name, axiom_name) | |
| 615 | } | |
| 71202 | 616 | |
| 617 | ||
| 71248 | 618 | /* HOL datatypes */ | 
| 619 | ||
| 620 | sealed case class Datatype( | |
| 621 | pos: Position.T, | |
| 622 | name: String, | |
| 623 | co: Boolean, | |
| 624 | typargs: List[(String, Term.Sort)], | |
| 625 | typ: Term.Typ, | |
| 75393 | 626 | constructors: List[(Term.Term, Term.Typ)] | 
| 627 |   ) {
 | |
| 71248 | 628 | def id: Option[Long] = Position.Id.unapply(pos) | 
| 629 | ||
| 630 | def cache(cache: Term.Cache): Datatype = | |
| 631 | Datatype( | |
| 632 | cache.position(pos), | |
| 633 | cache.string(name), | |
| 634 | co, | |
| 635 |         typargs.map({ case (name, sort) => (cache.string(name), cache.sort(sort)) }),
 | |
| 636 | cache.typ(typ), | |
| 637 |         constructors.map({ case (term, typ) => (cache.term(term), cache.typ(typ)) }))
 | |
| 638 | } | |
| 639 | ||
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 640 |   def read_datatypes(theory_context: Export.Theory_Context): List[Datatype] = {
 | 
| 76854 | 641 | val body = theory_context.yxml(Export.THEORY_PREFIX + "datatypes") | 
| 75393 | 642 |     val datatypes = {
 | 
| 71248 | 643 | import XML.Decode._ | 
| 644 | import Term_XML.Decode._ | |
| 645 | list(pair(properties, pair(string, pair(bool, pair(list(pair(string, sort)), | |
| 646 | pair(typ, list(pair(term, typ))))))))(body) | |
| 647 | } | |
| 648 | for ((pos, (name, (co, (typargs, (typ, constructors))))) <- datatypes) | |
| 649 | yield Datatype(pos, name, co, typargs, typ, constructors) | |
| 650 | } | |
| 651 | ||
| 652 | ||
| 71202 | 653 | /* Pure spec rules */ | 
| 654 | ||
| 75393 | 655 |   sealed abstract class Recursion {
 | 
| 71202 | 656 | def cache(cache: Term.Cache): Recursion = | 
| 657 |       this match {
 | |
| 658 | case Primrec(types) => Primrec(types.map(cache.string)) | |
| 659 | case Primcorec(types) => Primcorec(types.map(cache.string)) | |
| 660 | case _ => this | |
| 661 | } | |
| 662 | } | |
| 663 | case class Primrec(types: List[String]) extends Recursion | |
| 664 | case object Recdef extends Recursion | |
| 665 | case class Primcorec(types: List[String]) extends Recursion | |
| 666 | case object Corec extends Recursion | |
| 667 | case object Unknown_Recursion extends Recursion | |
| 668 | ||
| 75393 | 669 |   val decode_recursion: XML.Decode.T[Recursion] = {
 | 
| 71202 | 670 | import XML.Decode._ | 
| 671 | variant(List( | |
| 75436 | 672 |       { case (Nil, a) => Primrec(list(string)(a)) },
 | 
| 673 |       { case (Nil, Nil) => Recdef },
 | |
| 674 |       { case (Nil, a) => Primcorec(list(string)(a)) },
 | |
| 675 |       { case (Nil, Nil) => Corec },
 | |
| 676 |       { case (Nil, Nil) => Unknown_Recursion }))
 | |
| 71202 | 677 | } | 
| 678 | ||
| 679 | ||
| 75393 | 680 |   sealed abstract class Rough_Classification {
 | 
| 71202 | 681 | def is_equational: Boolean = this.isInstanceOf[Equational] | 
| 682 | def is_inductive: Boolean = this == Inductive | |
| 683 | def is_co_inductive: Boolean = this == Co_Inductive | |
| 684 | def is_relational: Boolean = is_inductive || is_co_inductive | |
| 685 | def is_unknown: Boolean = this == Unknown | |
| 686 | ||
| 687 | def cache(cache: Term.Cache): Rough_Classification = | |
| 688 |       this match {
 | |
| 689 | case Equational(recursion) => Equational(recursion.cache(cache)) | |
| 690 | case _ => this | |
| 691 | } | |
| 692 | } | |
| 693 | case class Equational(recursion: Recursion) extends Rough_Classification | |
| 694 | case object Inductive extends Rough_Classification | |
| 695 | case object Co_Inductive extends Rough_Classification | |
| 696 | case object Unknown extends Rough_Classification | |
| 697 | ||
| 75393 | 698 |   val decode_rough_classification: XML.Decode.T[Rough_Classification] = {
 | 
| 71202 | 699 | import XML.Decode._ | 
| 700 | variant(List( | |
| 75436 | 701 |       { case (Nil, a) => Equational(decode_recursion(a)) },
 | 
| 702 |       { case (Nil, Nil) => Inductive },
 | |
| 703 |       { case (Nil, Nil) => Co_Inductive },
 | |
| 704 |       { case (Nil, Nil) => Unknown }))
 | |
| 71202 | 705 | } | 
| 706 | ||
| 707 | ||
| 708 | sealed case class Spec_Rule( | |
| 71207 
8af82f3e03c9
formal position for spec rule (not significant for equality);
 wenzelm parents: 
71202diff
changeset | 709 | pos: Position.T, | 
| 71202 | 710 | name: String, | 
| 711 | rough_classification: Rough_Classification, | |
| 71208 
5e0050eb64f2
clarified export of spec rules: more like locale;
 wenzelm parents: 
71207diff
changeset | 712 | typargs: List[(String, Term.Sort)], | 
| 
5e0050eb64f2
clarified export of spec rules: more like locale;
 wenzelm parents: 
71207diff
changeset | 713 | args: List[(String, Term.Typ)], | 
| 71211 | 714 | terms: List[(Term.Term, Term.Typ)], | 
| 75393 | 715 | rules: List[Term.Term] | 
| 716 |   ) {
 | |
| 71207 
8af82f3e03c9
formal position for spec rule (not significant for equality);
 wenzelm parents: 
71202diff
changeset | 717 | def id: Option[Long] = Position.Id.unapply(pos) | 
| 
8af82f3e03c9
formal position for spec rule (not significant for equality);
 wenzelm parents: 
71202diff
changeset | 718 | |
| 71202 | 719 | def cache(cache: Term.Cache): Spec_Rule = | 
| 720 | Spec_Rule( | |
| 71207 
8af82f3e03c9
formal position for spec rule (not significant for equality);
 wenzelm parents: 
71202diff
changeset | 721 | cache.position(pos), | 
| 71202 | 722 | cache.string(name), | 
| 723 | rough_classification.cache(cache), | |
| 71208 
5e0050eb64f2
clarified export of spec rules: more like locale;
 wenzelm parents: 
71207diff
changeset | 724 |         typargs.map({ case (name, sort) => (cache.string(name), cache.sort(sort)) }),
 | 
| 
5e0050eb64f2
clarified export of spec rules: more like locale;
 wenzelm parents: 
71207diff
changeset | 725 |         args.map({ case (name, typ) => (cache.string(name), cache.typ(typ)) }),
 | 
| 71211 | 726 |         terms.map({ case (term, typ) => (cache.term(term), cache.typ(typ)) }),
 | 
| 73866 | 727 | rules.map(cache.term)) | 
| 71202 | 728 | } | 
| 729 | ||
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 730 |   def read_spec_rules(theory_context: Export.Theory_Context): List[Spec_Rule] = {
 | 
| 76854 | 731 | val body = theory_context.yxml(Export.THEORY_PREFIX + "spec_rules") | 
| 75393 | 732 |     val spec_rules = {
 | 
| 71202 | 733 | import XML.Decode._ | 
| 734 | import Term_XML.Decode._ | |
| 71207 
8af82f3e03c9
formal position for spec rule (not significant for equality);
 wenzelm parents: 
71202diff
changeset | 735 | list( | 
| 
8af82f3e03c9
formal position for spec rule (not significant for equality);
 wenzelm parents: 
71202diff
changeset | 736 | pair(properties, pair(string, pair(decode_rough_classification, | 
| 71208 
5e0050eb64f2
clarified export of spec rules: more like locale;
 wenzelm parents: 
71207diff
changeset | 737 | pair(list(pair(string, sort)), pair(list(pair(string, typ)), | 
| 71211 | 738 | pair(list(pair(term, typ)), list(term))))))))(body) | 
| 71202 | 739 | } | 
| 71208 
5e0050eb64f2
clarified export of spec rules: more like locale;
 wenzelm parents: 
71207diff
changeset | 740 | for ((pos, (name, (rough_classification, (typargs, (args, (terms, rules)))))) <- spec_rules) | 
| 
5e0050eb64f2
clarified export of spec rules: more like locale;
 wenzelm parents: 
71207diff
changeset | 741 | yield Spec_Rule(pos, name, rough_classification, typargs, args, terms, rules) | 
| 71202 | 742 | } | 
| 74261 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 743 | |
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 744 | |
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 745 | /* other entities */ | 
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 746 | |
| 75393 | 747 |   sealed case class Other() extends Content[Other] {
 | 
| 74261 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 748 | override def cache(cache: Term.Cache): Other = this | 
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 749 | } | 
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 750 | |
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 751 |   def read_others(theory_context: Export.Theory_Context): Map[String, List[Entity[Other]]] = {
 | 
| 74261 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 752 | val kinds = | 
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 753 |       theory_context.get(Export.THEORY_PREFIX + "other_kinds") match {
 | 
| 76853 | 754 | case Some(entry) => split_lines(entry.text) | 
| 74261 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 755 | case None => Nil | 
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 756 | } | 
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 757 | val other = Other() | 
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 758 | def read_other(kind: String): List[Entity[Other]] = | 
| 75774 
efc25bf4b795
discontinued Export.Provider in favour of Export.Context and its derivatives;
 wenzelm parents: 
75769diff
changeset | 759 | read_entities(theory_context, Export.THEORY_PREFIX + "other/" + kind, kind, _ => other) | 
| 74261 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 760 | |
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 761 | kinds.map(kind => kind -> read_other(kind)).toMap | 
| 
d28a51dd9da6
export other entities, e.g. relevant for formal document output;
 wenzelm parents: 
74119diff
changeset | 762 | } | 
| 68171 | 763 | } |