walther@59882: (* Title: BaseDefinitions/celem-8.sml walther@59882: Author: Walther Neuper walther@59882: (c) due to copyright terms walther@59882: walther@59919: Here is a minimum of code required for Know_Store.thy. walther@59919: For main code see structure Thy_Write and structure Thy_Present. walther@59919: walther@59919: The latter is legacy for HTML representation of theory data in Isac's Java front end. walther@59893: *) walther@59917: signature THEORY_DATA_STORE_WRITE = walther@59882: sig walther@59884: type authors walther@59884: datatype thydata walther@59904: = Hcal of {calc: Rule_Def.calc, coursedesign: authors, guh: Check_Unique.id, mathauthors: authors} Walther@60509: | Hord of {coursedesign: authors, guh: Check_Unique.id, mathauthors: authors, ord: Rewrite_Ord.function} walther@59904: | Hrls of {coursedesign: authors, guh: Check_Unique.id, mathauthors: authors, thy_rls: ThyC.id * Rule_Set.T} walther@59909: | Hthm of {coursedesign: authors, fillpats: Error_Pattern_Def.fill_in list, guh: Check_Unique.id, mathauthors: authors, thm: thm} walther@59904: | Html of {coursedesign: authors, guh: Check_Unique.id, html: string, mathauthors: authors} walther@59884: type theID walther@59888: val theID2str: string list -> string walther@59884: val the2str: thydata -> string walther@59884: val thes2str: thydata list -> string walther@59884: val theID2thyID: theID -> ThyC.id walther@59888: walther@59904: val part2guh: theID -> Check_Unique.id walther@59904: val thy2guh: theID -> Check_Unique.id walther@59904: val thypart2guh: theID -> Check_Unique.id walther@59904: val thm2guh: string * ThyC.id -> ThmC_Def.id -> Check_Unique.id walther@59904: val rls2guh: string * ThyC.id -> Rule_Set.id -> Check_Unique.id walther@59904: val cal2guh: string * ThyC.id -> string -> Check_Unique.id walther@59904: val ord2guh: string * ThyC.id -> string -> Check_Unique.id walther@59904: val theID2guh: theID -> Check_Unique.id walther@59888: walther@59897: val add_thydata: string list * string list -> thydata -> thydata Store.T -> thydata Store.T walther@59909: val update_hthm: thydata -> Error_Pattern_Def.fill_in list -> thydata walther@59882: end walther@59882: walther@59882: (**) walther@59917: structure Thy_Write(**): THEORY_DATA_STORE_WRITE(**) = walther@59882: struct walther@59882: (**) walther@59882: walther@59884: (*the key into the hierarchy ob theory elements*) walther@59884: type theID = string list; walther@59884: val theID2str = strs2str; (*theID eg. is ["IsacKnowledge", "Test", "Rulesets", "ac_plus_times"]*) walther@59884: fun theID2thyID theID = walther@59884: if length theID >= 3 then (last_elem o (drop_last_n 2)) theID walther@59962: else raise ERROR ("theID2thyID called with " ^ theID2str theID); walther@59884: type authors = string list; walther@59884: (* datatype for collecting thydata for hierarchy *) walther@59884: (*WN060720 more consistent naming would be 'type thyelem' or 'thelem'*) walther@59884: datatype thydata = walther@59904: Html of {guh: Check_Unique.id, coursedesign: authors, mathauthors: authors, html: string} walther@59909: | Hthm of {guh: Check_Unique.id, coursedesign: authors, mathauthors: authors, fillpats: Error_Pattern_Def.fill_in list, walther@59884: thm: thm} (* here no sym_thm, thus no thmID required *) walther@59904: | Hrls of {guh: Check_Unique.id, coursedesign: authors, mathauthors: authors, thy_rls: (ThyC.id * Rule_Set.T)} walther@59904: | Hcal of {guh: Check_Unique.id, coursedesign: authors, mathauthors: authors, calc: Rule_Def.calc} walther@59904: | Hord of {guh: Check_Unique.id, coursedesign: authors, mathauthors: authors, walther@59910: ord: (subst -> (term * term) -> bool)}; walther@59884: fun the2str (Html {guh, ...}) = guh walther@59884: | the2str (Hthm {guh, ...}) = guh walther@59884: | the2str (Hrls {guh, ...}) = guh walther@59884: | the2str (Hcal {guh, ...}) = guh walther@59884: | the2str (Hord {guh, ...}) = guh walther@59884: fun thes2str thes = map the2str thes |> list2str; walther@59884: walther@59884: (* notes on thehier concerning sym_thmID theorems (created in derivations, reverse rewriting) walther@59884: (a): thehier does not contain sym_thmID theorems walther@59884: (b): lookup for sym_thmID directly from Isabelle using sym_thm walther@59884: (within math-engine NO lookup in thehier -- within java in *.xml only!) walther@59884: TODO (c): export from thehier to xml walther@59884: TODO (c1) creates one entry for "thmID" (and NONE for "sym_thmID") in the hierarchy walther@59884: TODO (c2) creates 2 files "thy_*-thm-thmID.xml" and "thy_*-thm-sym_thmID.xml" walther@59884: TODO (d): 1 entry in the MiniBrowser's hierarchy (generated from xml) walther@59884: stands for both, "thmID" and "sym_thmID" walther@59884: TODO (d1) lookup from calctxt walther@59884: TODO (d1) lookup from from rule set in MiniBrowser *) walther@59897: type thehier = (thydata Store.node) list; walther@59887: (* required to determine sequence of main nodes of thehier in Know_Store.thy *) walther@59884: fun part2guh [str] = (case str of walther@59904: "Isabelle" => "thy_isab_" ^ str ^ "-part" : Check_Unique.id walther@59884: | "IsacScripts" => "thy_scri_" ^ str ^ "-part" walther@59884: | "IsacKnowledge" => "thy_isac_" ^ str ^ "-part" walther@59884: | str => raise ERROR ("thy2guh: called with \""^ str ^"\"")) walther@59884: | part2guh theID = raise ERROR ("part2guh called with theID = \"" ^ theID2str theID ^ "'"); walther@59884: walther@59884: fun thy2guh [part, thyID] = (case part of walther@59884: "Isabelle" => "thy_isab_" ^ thyID walther@59884: | "IsacScripts" => "thy_scri_" ^ thyID walther@59884: | "IsacKnowledge" => "thy_isac_" ^ thyID walther@59884: | str => raise ERROR ("thy2guh: called with \"" ^ str ^ "\"")) walther@59884: | thy2guh theID = raise ERROR ("thy2guh called with \"" ^ strs2str' theID ^ "\""); walther@59884: walther@59884: fun thypart2guh ([part, thyID, thypart] : theID) = (case part of walther@59904: "Isabelle" => "thy_isab_" ^ thyID ^ "-" ^ thypart : Check_Unique.id walther@59884: | "IsacScripts" => "thy_scri_" ^ thyID ^ "-" ^ thypart walther@59884: | "IsacKnowledge" => "thy_isac_" ^ thyID ^ "-" ^ thypart walther@59884: | str => raise ERROR ("thypart2guh: called with '" ^ str ^ "'")) walther@59884: | thypart2guh strs = raise ERROR ("thypart2guh called with \"" ^ strs2str' strs ^ "\""); walther@59884: walther@59884: walther@59884: (* convert the data got via contextToThy to a globally unique handle. walther@59884: there is another way to get the guh: get out of the 'theID' in the hierarchy *) walther@59884: fun thm2guh (isa, thyID) thmID = case isa of walther@59904: "Isabelle" => "thy_isab_" ^ thyID ^ "-thm-" ^ strip_thy thmID : Check_Unique.id walther@59884: | "IsacKnowledge" => "thy_isac_" ^ thyID ^ "-thm-" ^ strip_thy thmID walther@59884: | "IsacScripts" => "thy_scri_" ^ thyID ^ "-thm-" ^ strip_thy thmID walther@59884: | _ => raise ERROR walther@59884: ("thm2guh called with (isa, thyID) = (" ^ isa ^ ", " ^ thyID ^ ") for thm = \"" ^ thmID ^ "\""); walther@59884: walther@59884: fun rls2guh (isa, thyID) rls' = case isa of walther@59904: "Isabelle" => "thy_isab_" ^ thyID ^ "-rls-" ^ rls' : Check_Unique.id walther@59884: | "IsacKnowledge" => "thy_isac_" ^ thyID ^ "-rls-" ^ rls' walther@59884: | "IsacScripts" => "thy_scri_" ^ thyID ^ "-rls-" ^ rls' walther@59884: | _ => raise ERROR walther@59884: ("rls2guh called with (isa, thyID) = (" ^ isa ^ ", " ^ thyID ^ ") for rls = \"" ^ rls' ^ "\""); walther@59884: walther@59884: fun cal2guh (isa, thyID) calID = case isa of walther@59904: "Isabelle" => "thy_isab_" ^ thyID ^ "-cal-" ^ calID : Check_Unique.id walther@59884: | "IsacKnowledge" => "thy_isac_" ^ thyID ^ "-cal-" ^ calID walther@59884: | "IsacScripts" => "thy_scri_" ^ thyID ^ "-cal-" ^ calID walther@59884: | _ => raise ERROR walther@59884: ("cal2guh called with (isa, thyID) = (" ^ isa ^ ", " ^ thyID ^ ") for cal = \"" ^ calID ^ "\""); walther@59884: walther@59884: fun ord2guh (isa, thyID) rew_ord' = case isa of walther@59904: "Isabelle" => "thy_isab_" ^ thyID ^ "-ord-" ^ rew_ord' : Check_Unique.id walther@59884: | "IsacKnowledge" => "thy_isac_" ^ thyID ^ "-ord-" ^ rew_ord' walther@59884: | "IsacScripts" => "thy_scri_" ^ thyID ^ "-ord-" ^ rew_ord' walther@59884: | _ => raise ERROR walther@59884: ("ord2guh called with (isa, thyID) = (" ^ isa ^ ", " ^ thyID ^ ") for ord = \"" ^ rew_ord' ^ "\""); walther@59884: walther@59884: (* TODO walther@59884: fun theID2guh theID = case length theID of walther@59962: 0 => raise ERROR ("theID2guh: called with theID = " ^ strs2str' theID) walther@59884: | 1 => part2guh theID walther@59884: | 2 => thy2guh theID walther@59884: | 3 => thypart2guh theID walther@59884: | 4 => walther@59884: let val [isa, thyID, typ, elemID] = theID walther@59884: in case typ of walther@59884: "Theorems" => thm2guh (isa, thyID) elemID walther@59884: | "Rulesets" => rls2guh (isa, thyID) elemID walther@59884: | "Calculations" => cal2guh (isa, thyID) elemID walther@59884: | "Orders" => ord2guh (isa, thyID) elemID walther@59884: | "Theorems" => thy2guh [isa, thyID] walther@59884: | str => raise ERROR ("theID2guh: called with theID = " ^ strs2str' theID) walther@59884: end walther@59884: | n => raise ERROR ("theID2guh called with theID = " ^ strs2str' theID); walther@59884: *) walther@59884: (* not only for thydata, but also for thy's etc *) walther@59884: fun theID2guh [] = raise ERROR ("theID2guh: called with []") walther@59884: | theID2guh [str] = part2guh [str] walther@59884: | theID2guh [s1, s2] = thy2guh [s1, s2] walther@59884: | theID2guh [s1, s2, s3] = thypart2guh [s1, s2, s3] walther@59884: | theID2guh (strs as [isa, thyID, typ, elemID]) = (case typ of walther@59884: "Theorems" => thm2guh (isa, thyID) elemID walther@59884: | "Rulesets" => rls2guh (isa, thyID) elemID walther@59884: | "Calculations" => cal2guh (isa, thyID) elemID walther@59884: | "Orders" => ord2guh (isa, thyID) elemID walther@59884: | _ => raise ERROR ("theID2guh: called with theID = " ^ strs2str' strs)) walther@59884: | theID2guh strs = raise ERROR ("theID2guh called with theID = " ^ strs2str' strs); walther@59884: walther@59884: fun Html_default exist = (Html {guh = theID2guh exist, walther@59884: coursedesign = ["isac team 2006"], mathauthors = [], html = ""}) walther@59884: walther@59897: fun fill_parents (_, [i]) thydata = Store.Node (i, [thydata], []) walther@59884: | fill_parents (exist, i :: is) thydata = walther@59897: Store.Node (i, [Html_default (exist @ [i])], [fill_parents (exist @ [i], is) thydata]) walther@59884: | fill_parents _ _ = raise ERROR "Html_default: avoid ML warning: Matches are not exhaustive" walther@59884: walther@59884: fun add_thydata (exist, is) thydata [] = [fill_parents (exist, is) thydata] walther@59897: | add_thydata (exist, [i]) data (pys as (py as Store.Node (key, _, _)) :: pyss) = walther@59884: if i = key walther@59884: then pys (* preserve existing thydata *) walther@59884: else py :: add_thydata (exist, [i]) data pyss walther@59897: | add_thydata (exist, iss as (i :: is)) data ((py as Store.Node (key, d, pys)) :: pyss) = walther@59884: if i = key walther@59884: then walther@59884: if length pys = 0 walther@59897: then Store.Node (key, d, [fill_parents (exist @ [i], is) data]) :: pyss walther@59897: else Store.Node (key, d, add_thydata (exist @ [i], is) data pys) :: pyss walther@59884: else py :: add_thydata (exist, iss) data pyss walther@59884: | add_thydata _ _ _ = raise ERROR "add_thydata: avoid ML warning: Matches are not exhaustive" walther@59884: walther@59884: fun update_hthm (Hthm {guh, coursedesign, mathauthors, thm, ...}) fillpats' = walther@59884: Hthm {guh = guh, coursedesign = coursedesign, mathauthors = mathauthors, walther@59884: fillpats = fillpats', thm = thm} walther@59884: | update_hthm _ _ = raise ERROR "update_hthm: wrong arguments"; walther@59882: walther@59882: (**)end(**)