Rules that characterize specifications, with optional name and rough classification.
NB: In the face of arbitrary morphisms, the original shape of specifications may get lost.
*)
signature SPEC_RULES = sig datatype recursion =
Primrec ofstringlist | Recdef | Primcorec ofstringlist | Corec | Unknown_Recursion val recursion_ord: recursion ord val encode_recursion: recursion XML.Encode.T datatype rough_classification = Equational of recursion | Inductive | Co_Inductive | Unknown val rough_classification_ord: rough_classification ord val equational_primrec: stringlist -> rough_classification val equational_recdef: rough_classification val equational_primcorec: stringlist -> rough_classification val equational_corec: rough_classification val equational: rough_classification val is_equational: rough_classification -> bool val is_inductive: rough_classification -> bool val is_co_inductive: rough_classification -> bool val is_relational: rough_classification -> bool val is_unknown: rough_classification -> bool val encode_rough_classification: rough_classification XML.Encode.T type spec_rule =
{pos: Position.T,
name: string,
rough_classification: rough_classification,
terms: term list,
rules: thm list} val get: Proof.context -> spec_rule list val get_global: theory -> spec_rule list val dest_theory: theory -> spec_rule list val retrieve: Proof.context -> term -> spec_rule list val retrieve_global: theory -> term -> spec_rule list val add: binding -> rough_classification -> term list -> thm list -> local_theory -> local_theory val add_global: binding -> rough_classification -> term list -> thm list -> theory -> theory end;
val equational_primrec = Equational o Primrec; val equational_recdef = Equational Recdef; val equational_primcorec = Equational o Primcorec; val equational_corec = Equational Corec; val equational = Equational Unknown_Recursion;
fun map_spec_rules f ({pos, name, rough_classification, terms, rules}: spec_rule) : spec_rule =
{pos = pos, name = name, rough_classification = rough_classification, terms = terms,
rules = map f rules};
structure Data = Generic_Data
( type T = spec_rule Item_Net.T; val empty : T = Item_Net.init eq_spec #terms; val merge = Item_Net.merge;
);
(* get *)
fun get_generic imports context = let val thy = Context.theory_of context; val transfer = Global_Theory.transfer_theories thy; fun imported spec =
imports |> exists (fn thy => Item_Net.member (Data.get (Context.Theory thy)) spec); in
Item_Net.content (Data.get context)
|> filter_out imported
|> (map o map_spec_rules) transfer end;
val get = get_generic [] o Context.Proof; val get_global = get_generic [] o Context.Theory;
fun dest_theory thy = rev (get_generic (Theory.parents_of thy) (Context.Theory thy));
(* retrieve *)
fun retrieve_generic context =
Item_Net.retrieve (Data.get context)
#> (map o map_spec_rules) (Thm.transfer'' context);
val retrieve = retrieve_generic o Context.Proof; val retrieve_global = retrieve_generic o Context.Theory;
(* add *)
fun add b rough_classification terms rules lthy = let val n = length terms; val thms0 = map Thm.trim_context (map (Drule.mk_term o Thm.cterm_of lthy) terms @ rules); in
lthy |> Local_Theory.declaration {syntax = false, pervasive = true, pos = Binding.pos_of b}
(fn phi => fn context => let val psi = Morphism.set_trim_context'' context phi; val pos = Position.thread_data (); val name = Name_Space.full_name (Name_Space.naming_of context) (Morphism.binding psi b); val (terms', rules') =
chop n (Morphism.fact psi thms0)
|>> map (Thm.term_of o Drule.dest_term); in
context |> (Data.map o Item_Net.update)
{pos = pos, name = name, rough_classification = rough_classification,
terms = terms', rules = rules'} end) end;
fun add_global b rough_classification terms rules thy =
thy |> (Context.theory_map o Data.map o Item_Net.update)
{pos = Position.thread_data (),
name = Sign.full_name thy b,
rough_classification = rough_classification,
terms = terms,
rules = map Thm.trim_context rules};
end;
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.