src/Pure/Thy/export_theory.scala
changeset 71202 785610ad6bfa
parent 71016 b05d78bfc67c
child 71207 8af82f3e03c9
equal deleted inserted replaced
71181:8331063570d6 71202:785610ad6bfa
    40     locale_dependencies: Boolean = true,
    40     locale_dependencies: Boolean = true,
    41     classrel: Boolean = true,
    41     classrel: Boolean = true,
    42     arities: Boolean = true,
    42     arities: Boolean = true,
    43     constdefs: Boolean = true,
    43     constdefs: Boolean = true,
    44     typedefs: Boolean = true,
    44     typedefs: Boolean = true,
       
    45     spec_rules: Boolean = true,
    45     cache: Term.Cache = Term.make_cache()): Session =
    46     cache: Term.Cache = Term.make_cache()): Session =
    46   {
    47   {
    47     val thys =
    48     val thys =
    48       sessions_structure.build_requirements(List(session_name)).flatMap(session =>
    49       sessions_structure.build_requirements(List(session_name)).flatMap(session =>
    49         using(store.open_database(session))(db =>
    50         using(store.open_database(session))(db =>
    54               progress.echo("Reading theory " + theory)
    55               progress.echo("Reading theory " + theory)
    55               read_theory(Export.Provider.database(db, session, theory),
    56               read_theory(Export.Provider.database(db, session, theory),
    56                 session, theory, types = types, consts = consts,
    57                 session, theory, types = types, consts = consts,
    57                 axioms = axioms, thms = thms, classes = classes, locales = locales,
    58                 axioms = axioms, thms = thms, classes = classes, locales = locales,
    58                 locale_dependencies = locale_dependencies, classrel = classrel, arities = arities,
    59                 locale_dependencies = locale_dependencies, classrel = classrel, arities = arities,
    59                 constdefs = constdefs, typedefs = typedefs, cache = Some(cache))
    60                 constdefs = constdefs, typedefs = typedefs,
       
    61                 spec_rules = spec_rules, cache = Some(cache))
    60             }
    62             }
    61           }
    63           }
    62         }))
    64         }))
    63 
    65 
    64     val graph0 =
    66     val graph0 =
    88     locales: List[Locale],
    90     locales: List[Locale],
    89     locale_dependencies: List[Locale_Dependency],
    91     locale_dependencies: List[Locale_Dependency],
    90     classrel: List[Classrel],
    92     classrel: List[Classrel],
    91     arities: List[Arity],
    93     arities: List[Arity],
    92     constdefs: List[Constdef],
    94     constdefs: List[Constdef],
    93     typedefs: List[Typedef])
    95     typedefs: List[Typedef],
       
    96     spec_rules: List[Spec_Rule])
    94   {
    97   {
    95     override def toString: String = name
    98     override def toString: String = name
    96 
    99 
    97     def entity_iterator: Iterator[Entity] =
   100     def entity_iterator: Iterator[Entity] =
    98       types.iterator.map(_.entity) ++
   101       types.iterator.map(_.entity) ++
   114         locales.map(_.cache(cache)),
   117         locales.map(_.cache(cache)),
   115         locale_dependencies.map(_.cache(cache)),
   118         locale_dependencies.map(_.cache(cache)),
   116         classrel.map(_.cache(cache)),
   119         classrel.map(_.cache(cache)),
   117         arities.map(_.cache(cache)),
   120         arities.map(_.cache(cache)),
   118         constdefs.map(_.cache(cache)),
   121         constdefs.map(_.cache(cache)),
   119         typedefs.map(_.cache(cache)))
   122         typedefs.map(_.cache(cache)),
       
   123         spec_rules.map(_.cache(cache)))
   120   }
   124   }
   121 
   125 
   122   def read_theory(provider: Export.Provider, session_name: String, theory_name: String,
   126   def read_theory(provider: Export.Provider, session_name: String, theory_name: String,
   123     types: Boolean = true,
   127     types: Boolean = true,
   124     consts: Boolean = true,
   128     consts: Boolean = true,
   129     locale_dependencies: Boolean = true,
   133     locale_dependencies: Boolean = true,
   130     classrel: Boolean = true,
   134     classrel: Boolean = true,
   131     arities: Boolean = true,
   135     arities: Boolean = true,
   132     constdefs: Boolean = true,
   136     constdefs: Boolean = true,
   133     typedefs: Boolean = true,
   137     typedefs: Boolean = true,
       
   138     spec_rules: Boolean = true,
   134     cache: Option[Term.Cache] = None): Theory =
   139     cache: Option[Term.Cache] = None): Theory =
   135   {
   140   {
   136     val parents =
   141     val parents =
   137       if (theory_name == Thy_Header.PURE) Nil
   142       if (theory_name == Thy_Header.PURE) Nil
   138       else {
   143       else {
   153         if (locales) read_locales(provider) else Nil,
   158         if (locales) read_locales(provider) else Nil,
   154         if (locale_dependencies) read_locale_dependencies(provider) else Nil,
   159         if (locale_dependencies) read_locale_dependencies(provider) else Nil,
   155         if (classrel) read_classrel(provider) else Nil,
   160         if (classrel) read_classrel(provider) else Nil,
   156         if (arities) read_arities(provider) else Nil,
   161         if (arities) read_arities(provider) else Nil,
   157         if (constdefs) read_constdefs(provider) else Nil,
   162         if (constdefs) read_constdefs(provider) else Nil,
   158         if (typedefs) read_typedefs(provider) else Nil)
   163         if (typedefs) read_typedefs(provider) else Nil,
       
   164         if (spec_rules) read_spec_rules(provider) else Nil)
   159     if (cache.isDefined) theory.cache(cache.get) else theory
   165     if (cache.isDefined) theory.cache(cache.get) else theory
   160   }
   166   }
   161 
   167 
   162   def read_pure[A](store: Sessions.Store, read: (Export.Provider, String, String) => A): A =
   168   def read_pure[A](store: Sessions.Store, read: (Export.Provider, String, String) => A): A =
   163   {
   169   {
   641       list(pair(string, pair(typ, pair(typ, pair(string, pair(string, string))))))(body)
   647       list(pair(string, pair(typ, pair(typ, pair(string, pair(string, string))))))(body)
   642     }
   648     }
   643     for { (name, (rep_type, (abs_type, (rep_name, (abs_name, axiom_name))))) <- typedefs }
   649     for { (name, (rep_type, (abs_type, (rep_name, (abs_name, axiom_name))))) <- typedefs }
   644     yield Typedef(name, rep_type, abs_type, rep_name, abs_name, axiom_name)
   650     yield Typedef(name, rep_type, abs_type, rep_name, abs_name, axiom_name)
   645   }
   651   }
       
   652 
       
   653 
       
   654   /* Pure spec rules */
       
   655 
       
   656   sealed abstract class Recursion
       
   657   {
       
   658     def cache(cache: Term.Cache): Recursion =
       
   659       this match {
       
   660         case Primrec(types) => Primrec(types.map(cache.string))
       
   661         case Primcorec(types) => Primcorec(types.map(cache.string))
       
   662         case _ => this
       
   663       }
       
   664   }
       
   665   case class Primrec(types: List[String]) extends Recursion
       
   666   case object Recdef extends Recursion
       
   667   case class Primcorec(types: List[String]) extends Recursion
       
   668   case object Corec extends Recursion
       
   669   case object Unknown_Recursion extends Recursion
       
   670 
       
   671   val decode_recursion: XML.Decode.T[Recursion] =
       
   672   {
       
   673     import XML.Decode._
       
   674     variant(List(
       
   675       { case (Nil, a) => Primrec(list(string)(a)) },
       
   676       { case (Nil, Nil) => Recdef },
       
   677       { case (Nil, a) => Primcorec(list(string)(a)) },
       
   678       { case (Nil, Nil) => Corec },
       
   679       { case (Nil, Nil) => Unknown_Recursion }))
       
   680   }
       
   681 
       
   682 
       
   683   sealed abstract class Rough_Classification
       
   684   {
       
   685     def is_equational: Boolean = this.isInstanceOf[Equational]
       
   686     def is_inductive: Boolean = this == Inductive
       
   687     def is_co_inductive: Boolean = this == Co_Inductive
       
   688     def is_relational: Boolean = is_inductive || is_co_inductive
       
   689     def is_unknown: Boolean = this == Unknown
       
   690 
       
   691     def cache(cache: Term.Cache): Rough_Classification =
       
   692       this match {
       
   693         case Equational(recursion) => Equational(recursion.cache(cache))
       
   694         case _ => this
       
   695       }
       
   696   }
       
   697   case class Equational(recursion: Recursion) extends Rough_Classification
       
   698   case object Inductive extends Rough_Classification
       
   699   case object Co_Inductive extends Rough_Classification
       
   700   case object Unknown extends Rough_Classification
       
   701 
       
   702   val decode_rough_classification: XML.Decode.T[Rough_Classification] =
       
   703   {
       
   704     import XML.Decode._
       
   705     variant(List(
       
   706       { case (Nil, a) => Equational(decode_recursion(a)) },
       
   707       { case (Nil, Nil) => Inductive },
       
   708       { case (Nil, Nil) => Co_Inductive },
       
   709       { case (Nil, Nil) => Unknown }))
       
   710   }
       
   711 
       
   712 
       
   713   sealed case class Spec_Rule(
       
   714     name: String,
       
   715     rough_classification: Rough_Classification,
       
   716     terms: List[Term.Term],
       
   717     rules: List[Prop])
       
   718   {
       
   719     def cache(cache: Term.Cache): Spec_Rule =
       
   720       Spec_Rule(
       
   721         cache.string(name),
       
   722         rough_classification.cache(cache),
       
   723         terms.map(cache.term(_)),
       
   724         rules.map(_.cache(cache)))
       
   725   }
       
   726 
       
   727   def read_spec_rules(provider: Export.Provider): List[Spec_Rule] =
       
   728   {
       
   729     val body = provider.uncompressed_yxml(export_prefix + "spec_rules")
       
   730     val spec_rules =
       
   731     {
       
   732       import XML.Decode._
       
   733       import Term_XML.Decode._
       
   734       list(pair(string, pair(decode_rough_classification, pair(list(term), list(decode_prop)))))(
       
   735         body)
       
   736     }
       
   737     for ((name, (rough_classification, (terms, rules))) <- spec_rules)
       
   738       yield Spec_Rule(name, rough_classification, terms, rules)
       
   739   }
   646 }
   740 }