| author | wenzelm | 
| Tue, 05 Sep 2006 22:05:49 +0200 | |
| changeset 20481 | c96f80442ce6 | 
| parent 19547 | 17f504343d0f | 
| child 20664 | ffbc5a57191a | 
| permissions | -rw-r--r-- | 
| 
3604
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
1  | 
(* Title: Pure/Thy/thy_info.ML  | 
| 
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
2  | 
ID: $Id$  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
3  | 
Author: Markus Wenzel, TU Muenchen  | 
| 
3604
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
4  | 
|
| 15801 | 5  | 
Main part of theory loader database, including handling of theory and  | 
6  | 
file dependencies.  | 
|
| 3976 | 7  | 
*)  | 
| 
3604
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
8  | 
|
| 5209 | 9  | 
signature BASIC_THY_INFO =  | 
10  | 
sig  | 
|
11  | 
val theory: string -> theory  | 
|
| 6241 | 12  | 
(*val use: string -> unit*) (*exported later*)  | 
13  | 
val time_use: string -> unit  | 
|
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
14  | 
val touch_thy: string -> unit  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
15  | 
val use_thy: string -> unit  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
16  | 
val update_thy: string -> unit  | 
| 6666 | 17  | 
val remove_thy: string -> unit  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
18  | 
val time_use_thy: string -> unit  | 
| 6527 | 19  | 
val use_thy_only: string -> unit  | 
| 7099 | 20  | 
val update_thy_only: string -> unit  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
21  | 
end;  | 
| 5209 | 22  | 
|
| 
3604
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
23  | 
signature THY_INFO =  | 
| 
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
24  | 
sig  | 
| 5209 | 25  | 
include BASIC_THY_INFO  | 
| 7099 | 26  | 
datatype action = Update | Outdate | Remove  | 
27  | 
val str_of_action: action -> string  | 
|
28  | 
val add_hook: (action -> string -> unit) -> unit  | 
|
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
29  | 
val names: unit -> string list  | 
| 7910 | 30  | 
val known_thy: string -> bool  | 
| 7935 | 31  | 
val check_known_thy: string -> bool  | 
32  | 
val if_known_thy: (string -> unit) -> string -> unit  | 
|
| 7288 | 33  | 
val lookup_theory: string -> theory option  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
34  | 
val get_theory: string -> theory  | 
| 19547 | 35  | 
val the_theory: string -> theory -> theory  | 
| 6654 | 36  | 
val get_preds: string -> string list  | 
| 7935 | 37  | 
val loaded_files: string -> Path.T list  | 
| 7910 | 38  | 
val touch_child_thys: string -> unit  | 
| 7099 | 39  | 
val touch_all_thys: unit -> unit  | 
| 7941 | 40  | 
val load_file: bool -> Path.T -> unit  | 
| 6241 | 41  | 
val use: string -> unit  | 
| 7952 | 42  | 
val quiet_update_thy: bool -> string -> unit  | 
| 9822 | 43  | 
val pretend_use_thy_only: string -> unit  | 
| 
15158
 
2281784015a5
Fixed several bugs related to path specifications in theory names.
 
berghofe 
parents: 
15065 
diff
changeset
 | 
44  | 
val begin_theory: (Path.T option -> string -> string list ->  | 
| 
 
2281784015a5
Fixed several bugs related to path specifications in theory names.
 
berghofe 
parents: 
15065 
diff
changeset
 | 
45  | 
(Path.T * bool) list -> theory -> theory) ->  | 
| 17365 | 46  | 
string -> string list -> (Path.T * bool) list -> bool -> theory  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
47  | 
val end_theory: theory -> theory  | 
| 6666 | 48  | 
val finish: unit -> unit  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
49  | 
val register_theory: theory -> unit  | 
| 15633 | 50  | 
val pretty_theory: theory -> Pretty.T  | 
| 
3604
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
51  | 
end;  | 
| 
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
52  | 
|
| 6362 | 53  | 
structure ThyInfo: THY_INFO =  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
54  | 
struct  | 
| 
3604
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
55  | 
|
| 
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
56  | 
|
| 7099 | 57  | 
(** theory loader actions and hooks **)  | 
58  | 
||
59  | 
datatype action = Update | Outdate | Remove;  | 
|
60  | 
val str_of_action = fn Update => "Update" | Outdate => "Outdate" | Remove => "Remove";  | 
|
61  | 
||
62  | 
local  | 
|
63  | 
val hooks = ref ([]: (action -> string -> unit) list);  | 
|
64  | 
in  | 
|
65  | 
fun add_hook f = hooks := f :: ! hooks;  | 
|
| 15570 | 66  | 
fun perform action name = List.app (fn f => (try (fn () => f action name) (); ())) (! hooks);  | 
| 7099 | 67  | 
end;  | 
68  | 
||
69  | 
||
70  | 
||
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
71  | 
(** thy database **)  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
72  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
73  | 
(* messages *)  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
74  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
75  | 
fun gen_msg txt [] = txt  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
76  | 
| gen_msg txt names = txt ^ " " ^ commas_quote names;  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
77  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
78  | 
fun loader_msg txt names = gen_msg ("Theory loader: " ^ txt) names;
 | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
79  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
80  | 
val show_path = space_implode " via " o map quote;  | 
| 9332 | 81  | 
fun cycle_msg names = loader_msg ("cyclic dependency of " ^ show_path names) [];
 | 
| 
3604
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
82  | 
|
| 
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
83  | 
|
| 6666 | 84  | 
(* derived graph operations *)  | 
| 
3604
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
85  | 
|
| 9327 | 86  | 
fun add_deps name parents G = Graph.add_deps_acyclic (name, parents) G  | 
| 9332 | 87  | 
handle Graph.CYCLES namess => error (cat_lines (map cycle_msg namess));  | 
| 
3604
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
88  | 
|
| 7952 | 89  | 
fun upd_deps name entry G =  | 
| 19473 | 90  | 
fold (fn parent => Graph.del_edge (parent, name)) (Graph.imm_preds G name) G  | 
| 7952 | 91  | 
|> Graph.map_node name (K entry);  | 
| 3976 | 92  | 
|
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
93  | 
fun update_node name parents entry G =  | 
| 7952 | 94  | 
(if can (Graph.get_node G) name then upd_deps name entry G else Graph.new_node (name, entry) G)  | 
95  | 
|> add_deps name parents;  | 
|
| 
3604
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
96  | 
|
| 
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
97  | 
|
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
98  | 
(* thy database *)  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
99  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
100  | 
type deps =  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
101  | 
  {present: bool, outdated: bool,
 | 
| 7941 | 102  | 
master: ThyLoad.master option, files: (Path.T * (Path.T * File.info) option) list};  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
103  | 
|
| 6241 | 104  | 
fun make_deps present outdated master files =  | 
105  | 
  {present = present, outdated = outdated, master = master, files = files}: deps;
 | 
|
| 
3604
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
106  | 
|
| 15531 | 107  | 
fun init_deps master files = SOME (make_deps false true master (map (rpair NONE) files));  | 
| 7211 | 108  | 
|
109  | 
||
| 6362 | 110  | 
type thy = deps option * theory option;  | 
| 
3604
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
111  | 
|
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
112  | 
local  | 
| 6362 | 113  | 
val database = ref (Graph.empty: thy Graph.T);  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
114  | 
in  | 
| 6362 | 115  | 
fun get_thys () = ! database;  | 
| 9137 | 116  | 
val change_thys = Library.change database;  | 
| 
3604
 
6bf9f09f3d61
Moved functions for theory information storage / retrieval
 
berghofe 
parents:  
diff
changeset
 | 
117  | 
end;  | 
| 5209 | 118  | 
|
119  | 
||
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
120  | 
(* access thy graph *)  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
121  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
122  | 
fun thy_graph f x = f (get_thys ()) x;  | 
| 9417 | 123  | 
|
124  | 
(*theory names in topological order*)  | 
|
125  | 
fun get_names () =  | 
|
126  | 
let val G = get_thys ()  | 
|
| 14774 | 127  | 
in Graph.all_succs G (Graph.minimals G) end;  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
128  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
129  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
130  | 
(* access thy *)  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
131  | 
|
| 7935 | 132  | 
fun lookup_thy name =  | 
| 15531 | 133  | 
SOME (thy_graph Graph.get_node name) handle Graph.UNDEF _ => NONE;  | 
| 7935 | 134  | 
|
| 16047 | 135  | 
val known_thy = is_some o lookup_thy;  | 
| 7935 | 136  | 
fun check_known_thy name = known_thy name orelse (warning ("Unknown theory " ^ quote name); false);
 | 
137  | 
fun if_known_thy f name = if check_known_thy name then f name else ();  | 
|
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
138  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
139  | 
fun get_thy name =  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
140  | 
(case lookup_thy name of  | 
| 15531 | 141  | 
SOME thy => thy  | 
142  | 
| NONE => error (loader_msg "nothing known about theory" [name]));  | 
|
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
143  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
144  | 
fun change_thy name f = (get_thy name; change_thys (Graph.map_node name f));  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
145  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
146  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
147  | 
(* access deps *)  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
148  | 
|
| 15570 | 149  | 
val lookup_deps = Option.map #1 o lookup_thy;  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
150  | 
val get_deps = #1 o get_thy;  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
151  | 
fun change_deps name f = change_thy name (fn (deps, x) => (f deps, x));  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
152  | 
|
| 6666 | 153  | 
fun is_finished name = is_none (get_deps name);  | 
| 15531 | 154  | 
fun get_files name = (case get_deps name of SOME {files, ...} => files | _ => []);
 | 
| 7191 | 155  | 
|
156  | 
fun loaded_files name =  | 
|
157  | 
(case get_deps name of  | 
|
| 15531 | 158  | 
NONE => []  | 
159  | 
  | SOME {master, files, ...} =>
 | 
|
160  | 
(case master of SOME m => [#1 (ThyLoad.get_thy m)] | NONE => []) @  | 
|
| 
19482
 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 
wenzelm 
parents: 
19473 
diff
changeset
 | 
161  | 
(map_filter (Option.map #1 o #2) files));  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
162  | 
|
| 6654 | 163  | 
fun get_preds name =  | 
| 9327 | 164  | 
(thy_graph Graph.imm_preds name) handle Graph.UNDEF _ =>  | 
| 6654 | 165  | 
error (loader_msg "nothing known about theory" [name]);  | 
166  | 
||
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
167  | 
|
| 16047 | 168  | 
(* pretty printing a theory *)  | 
169  | 
||
170  | 
local  | 
|
| 15633 | 171  | 
|
| 16047 | 172  | 
fun relevant_names names =  | 
173  | 
let  | 
|
174  | 
val (finished, unfinished) =  | 
|
| 19305 | 175  | 
List.filter (fn name => name = Context.draftN orelse known_thy name) names  | 
176  | 
|> List.partition (fn name => name <> Context.draftN andalso is_finished name);  | 
|
| 16047 | 177  | 
in (if not (null finished) then [List.last finished] else []) @ unfinished end;  | 
| 15633 | 178  | 
|
| 16047 | 179  | 
in  | 
| 15633 | 180  | 
|
| 16454 | 181  | 
fun pretty_theory thy =  | 
182  | 
  Pretty.str_list "{" "}" (relevant_names (Context.names_of thy));
 | 
|
| 15633 | 183  | 
|
| 16047 | 184  | 
end;  | 
185  | 
||
| 15633 | 186  | 
|
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
187  | 
(* access theory *)  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
188  | 
|
| 7687 | 189  | 
fun lookup_theory name =  | 
190  | 
(case lookup_thy name of  | 
|
| 15531 | 191  | 
SOME (_, SOME thy) => SOME thy  | 
192  | 
| _ => NONE);  | 
|
| 7288 | 193  | 
|
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
194  | 
fun get_theory name =  | 
| 7288 | 195  | 
(case lookup_theory name of  | 
| 15531 | 196  | 
(SOME theory) => theory  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
197  | 
| _ => error (loader_msg "undefined theory entry for" [name]));  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
198  | 
|
| 19547 | 199  | 
fun the_theory name thy =  | 
200  | 
if Context.theory_name thy = name then thy  | 
|
201  | 
else get_theory name;  | 
|
202  | 
||
| 15531 | 203  | 
fun put_theory name theory = change_thy name (fn (deps, _) => (deps, SOME theory));  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
204  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
205  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
206  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
207  | 
(** thy operations **)  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
208  | 
|
| 6241 | 209  | 
(* maintain 'outdated' flag *)  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
210  | 
|
| 7099 | 211  | 
local  | 
212  | 
||
| 6241 | 213  | 
fun is_outdated name =  | 
214  | 
(case lookup_deps name of  | 
|
| 15531 | 215  | 
    SOME (SOME {outdated, ...}) => outdated
 | 
| 6241 | 216  | 
| _ => false);  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
217  | 
|
| 6241 | 218  | 
fun outdate_thy name =  | 
| 7099 | 219  | 
if is_finished name orelse is_outdated name then ()  | 
| 15570 | 220  | 
  else (change_deps name (Option.map (fn {present, outdated = _, master, files} =>
 | 
| 7099 | 221  | 
make_deps present true master files)); perform Outdate name);  | 
222  | 
||
| 7910 | 223  | 
fun check_unfinished name =  | 
| 15531 | 224  | 
if is_finished name then (warning (loader_msg "tried to touch finished theory" [name]); NONE)  | 
225  | 
else SOME name;  | 
|
| 7910 | 226  | 
|
| 7099 | 227  | 
in  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
228  | 
|
| 7910 | 229  | 
fun touch_thys names =  | 
| 
19482
 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 
wenzelm 
parents: 
19473 
diff
changeset
 | 
230  | 
List.app outdate_thy (thy_graph Graph.all_succs (map_filter check_unfinished names));  | 
| 7910 | 231  | 
|
232  | 
fun touch_thy name = touch_thys [name];  | 
|
233  | 
fun touch_child_thys name = touch_thys (thy_graph Graph.imm_succs name);  | 
|
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
234  | 
|
| 15570 | 235  | 
fun touch_all_thys () = List.app outdate_thy (get_names ());  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
236  | 
|
| 7099 | 237  | 
end;  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
238  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
239  | 
|
| 7244 | 240  | 
(* check 'finished' state *)  | 
241  | 
||
242  | 
fun check_unfinished fail name =  | 
|
| 7910 | 243  | 
if known_thy name andalso is_finished name then  | 
| 7288 | 244  | 
fail (loader_msg "cannot update finished theory" [name])  | 
| 7244 | 245  | 
else ();  | 
246  | 
||
247  | 
||
| 7941 | 248  | 
(* load_file *)  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
249  | 
|
| 15570 | 250  | 
val opt_path = Option.map (Path.dir o fst o ThyLoad.get_thy);  | 
| 19473 | 251  | 
fun opt_path' (d: deps option) = the_default NONE (Option.map (opt_path o #master) d);  | 
252  | 
fun opt_path'' d = the_default NONE (Option.map opt_path' d);  | 
|
| 
15158
 
2281784015a5
Fixed several bugs related to path specifications in theory names.
 
berghofe 
parents: 
15065 
diff
changeset
 | 
253  | 
|
| 7191 | 254  | 
local  | 
255  | 
||
| 15531 | 256  | 
fun provide path name info (deps as SOME {present, outdated, master, files}) =
 | 
| 7941 | 257  | 
(if exists (equal path o #1) files then ()  | 
258  | 
else warning (loader_msg "undeclared dependency of theory" [name] ^  | 
|
259  | 
" on file: " ^ quote (Path.pack path));  | 
|
| 17192 | 260  | 
SOME (make_deps present outdated master (AList.update (op =) (path, SOME info) files)))  | 
| 15531 | 261  | 
| provide _ _ _ NONE = NONE;  | 
| 7941 | 262  | 
|
263  | 
fun run_file path =  | 
|
| 16454 | 264  | 
(case Option.map Context.theory_name (Context.get_context ()) of  | 
| 15531 | 265  | 
NONE => (ThyLoad.load_file NONE path; ())  | 
266  | 
| SOME name => (case lookup_deps name of  | 
|
267  | 
SOME deps => change_deps name (provide path name  | 
|
| 
15158
 
2281784015a5
Fixed several bugs related to path specifications in theory names.
 
berghofe 
parents: 
15065 
diff
changeset
 | 
268  | 
(ThyLoad.load_file (opt_path' deps) path))  | 
| 15531 | 269  | 
| NONE => (ThyLoad.load_file NONE path; ())));  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
270  | 
|
| 7191 | 271  | 
in  | 
272  | 
||
| 18721 | 273  | 
fun load_file time path = Output.toplevel_errors (fn () =>  | 
| 7941 | 274  | 
if time then  | 
| 7244 | 275  | 
let val name = Path.pack path in  | 
276  | 
timeit (fn () =>  | 
|
| 9778 | 277  | 
       (priority ("\n**** Starting file " ^ quote name ^ " ****");
 | 
| 9036 | 278  | 
run_file path;  | 
| 9778 | 279  | 
        priority ("**** Finished file " ^ quote name ^ " ****\n")))
 | 
| 7244 | 280  | 
end  | 
| 18721 | 281  | 
else run_file path) ();  | 
| 7941 | 282  | 
|
283  | 
val use = load_file false o Path.unpack;  | 
|
284  | 
val time_use = load_file true o Path.unpack;  | 
|
| 7191 | 285  | 
|
286  | 
end;  | 
|
| 6233 | 287  | 
|
288  | 
||
| 7099 | 289  | 
(* load_thy *)  | 
290  | 
||
| 9490 | 291  | 
fun required_by _ [] = ""  | 
292  | 
| required_by s initiators = s ^ "(required by " ^ show_path (rev initiators) ^ ")";  | 
|
| 7099 | 293  | 
|
| 15065 | 294  | 
fun load_thy really ml time initiators dir name =  | 
| 7099 | 295  | 
let  | 
| 9822 | 296  | 
val _ =  | 
297  | 
      if really then priority ("Loading theory " ^ quote name ^ required_by " " initiators)
 | 
|
298  | 
      else priority ("Registering theory " ^ quote name);
 | 
|
| 7099 | 299  | 
|
300  | 
val _ = touch_thy name;  | 
|
| 9822 | 301  | 
val master =  | 
302  | 
if really then ThyLoad.load_thy dir name ml time  | 
|
303  | 
else #1 (ThyLoad.deps_thy dir name ml);  | 
|
| 7099 | 304  | 
|
305  | 
val files = get_files name;  | 
|
| 
19482
 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 
wenzelm 
parents: 
19473 
diff
changeset
 | 
306  | 
val missing_files = map_filter (fn (path, NONE) => SOME (Path.pack path) | _ => NONE) files;  | 
| 7099 | 307  | 
in  | 
308  | 
if null missing_files then ()  | 
|
309  | 
else warning (loader_msg "unresolved dependencies of theory" [name] ^  | 
|
| 7223 | 310  | 
" on file(s): " ^ commas_quote missing_files);  | 
| 15531 | 311  | 
change_deps name (fn _ => SOME (make_deps true false (SOME master) files));  | 
| 7099 | 312  | 
perform Update name  | 
313  | 
end;  | 
|
314  | 
||
315  | 
||
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
316  | 
(* require_thy *)  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
317  | 
|
| 15065 | 318  | 
fun base_of_path s = Path.pack (Path.base (Path.unpack s));  | 
319  | 
||
| 7211 | 320  | 
local  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
321  | 
|
| 7941 | 322  | 
fun load_deps ml dir name =  | 
323  | 
let val (master, (parents, files)) = ThyLoad.deps_thy dir name ml  | 
|
| 15531 | 324  | 
in (SOME (init_deps (SOME master) files), parents) end;  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
325  | 
|
| 15531 | 326  | 
fun file_current master (_, NONE) = false  | 
| 
15158
 
2281784015a5
Fixed several bugs related to path specifications in theory names.
 
berghofe 
parents: 
15065 
diff
changeset
 | 
327  | 
| file_current master (path, info) =  | 
| 
 
2281784015a5
Fixed several bugs related to path specifications in theory names.
 
berghofe 
parents: 
15065 
diff
changeset
 | 
328  | 
(info = ThyLoad.check_file (opt_path master) path);  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
329  | 
|
| 7941 | 330  | 
fun current_deps ml strict dir name =  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
331  | 
(case lookup_deps name of  | 
| 15531 | 332  | 
NONE => (false, load_deps ml dir name)  | 
333  | 
| SOME deps =>  | 
|
| 
15158
 
2281784015a5
Fixed several bugs related to path specifications in theory names.
 
berghofe 
parents: 
15065 
diff
changeset
 | 
334  | 
let  | 
| 15531 | 335  | 
fun get_name s = (case opt_path'' (lookup_deps s) of NONE => s  | 
336  | 
| SOME p => Path.pack (Path.append p (Path.basic s)));  | 
|
337  | 
val same_deps = (NONE, map get_name (thy_graph Graph.imm_preds name))  | 
|
| 
15158
 
2281784015a5
Fixed several bugs related to path specifications in theory names.
 
berghofe 
parents: 
15065 
diff
changeset
 | 
338  | 
in  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
339  | 
(case deps of  | 
| 15531 | 340  | 
NONE => (true, same_deps)  | 
341  | 
        | SOME {present, outdated, master, files} =>
 | 
|
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
342  | 
if present andalso not strict then (true, same_deps)  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
343  | 
else  | 
| 15531 | 344  | 
let val master' = SOME (ThyLoad.check_thy dir name ml) in  | 
| 7941 | 345  | 
if master <> master' then (false, load_deps ml dir name)  | 
| 
15158
 
2281784015a5
Fixed several bugs related to path specifications in theory names.
 
berghofe 
parents: 
15065 
diff
changeset
 | 
346  | 
else (not outdated andalso forall (file_current master') files, same_deps)  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
347  | 
end)  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
348  | 
end);  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
349  | 
|
| 9822 | 350  | 
fun require_thy really ml time strict keep_strict initiators prfx (visited, str) =  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
351  | 
let  | 
| 7066 | 352  | 
val path = Path.expand (Path.unpack str);  | 
| 
6484
 
3f098b0ec683
use_thy etc.: may specify path prefix, which is temporarily used as load path;
 
wenzelm 
parents: 
6389 
diff
changeset
 | 
353  | 
val name = Path.pack (Path.base path);  | 
| 7066 | 354  | 
in  | 
| 9332 | 355  | 
if name mem_string initiators then error (cycle_msg initiators) else ();  | 
| 7952 | 356  | 
if known_thy name andalso is_finished name orelse name mem_string visited then  | 
357  | 
(visited, (true, name))  | 
|
| 7066 | 358  | 
else  | 
359  | 
let  | 
|
360  | 
val dir = Path.append prfx (Path.dir path);  | 
|
| 9822 | 361  | 
val req_parent = require_thy true true time (strict andalso keep_strict) keep_strict  | 
| 15065 | 362  | 
(name :: initiators);  | 
| 
6484
 
3f098b0ec683
use_thy etc.: may specify path prefix, which is temporarily used as load path;
 
wenzelm 
parents: 
6389 
diff
changeset
 | 
363  | 
|
| 18678 | 364  | 
val (current, (new_deps, parents)) = current_deps ml strict dir name  | 
365  | 
handle ERROR msg => cat_error msg  | 
|
366  | 
(loader_msg "the error(s) above occurred while examining theory" [name] ^  | 
|
367  | 
(if null initiators then "" else required_by "\n" initiators));  | 
|
| 19473 | 368  | 
val dir' = the_default dir (opt_path'' new_deps);  | 
| 15065 | 369  | 
val (visited', parent_results) = foldl_map (req_parent dir') (name :: visited, parents);  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
370  | 
|
| 15531 | 371  | 
val thy = if not really then SOME (get_theory name) else NONE;  | 
| 7066 | 372  | 
val result =  | 
| 17756 | 373  | 
if current andalso forall fst parent_results then true  | 
| 7066 | 374  | 
else  | 
375  | 
((case new_deps of  | 
|
| 15531 | 376  | 
SOME deps => change_thys (update_node name (map base_of_path parents) (deps, thy))  | 
377  | 
| NONE => ());  | 
|
| 15065 | 378  | 
load_thy really ml (time orelse ! Output.timing) initiators dir name;  | 
| 7099 | 379  | 
false);  | 
| 7066 | 380  | 
in (visited', (result, name)) end  | 
381  | 
end;  | 
|
| 
6484
 
3f098b0ec683
use_thy etc.: may specify path prefix, which is temporarily used as load path;
 
wenzelm 
parents: 
6389 
diff
changeset
 | 
382  | 
|
| 18721 | 383  | 
fun gen_use_thy' req prfx s = Output.toplevel_errors (fn () =>  | 
| 
15158
 
2281784015a5
Fixed several bugs related to path specifications in theory names.
 
berghofe 
parents: 
15065 
diff
changeset
 | 
384  | 
let val (_, (_, name)) = req [] prfx ([], s)  | 
| 18721 | 385  | 
in Context.context (get_theory name) end) ();  | 
| 6241 | 386  | 
|
| 
15158
 
2281784015a5
Fixed several bugs related to path specifications in theory names.
 
berghofe 
parents: 
15065 
diff
changeset
 | 
387  | 
fun gen_use_thy req = gen_use_thy' req Path.current;  | 
| 
 
2281784015a5
Fixed several bugs related to path specifications in theory names.
 
berghofe 
parents: 
15065 
diff
changeset
 | 
388  | 
|
| 7244 | 389  | 
fun warn_finished f name = (check_unfinished warning name; f name);  | 
390  | 
||
| 7211 | 391  | 
in  | 
392  | 
||
| 
15158
 
2281784015a5
Fixed several bugs related to path specifications in theory names.
 
berghofe 
parents: 
15065 
diff
changeset
 | 
393  | 
val weak_use_thy = gen_use_thy' (require_thy true true false false false);  | 
| 
 
2281784015a5
Fixed several bugs related to path specifications in theory names.
 
berghofe 
parents: 
15065 
diff
changeset
 | 
394  | 
fun quiet_update_thy' ml = gen_use_thy' (require_thy true ml false true true);  | 
| 
 
2281784015a5
Fixed several bugs related to path specifications in theory names.
 
berghofe 
parents: 
15065 
diff
changeset
 | 
395  | 
fun quiet_update_thy ml = gen_use_thy (require_thy true ml false true true);  | 
| 7244 | 396  | 
|
| 9822 | 397  | 
val use_thy = warn_finished (gen_use_thy (require_thy true true false true false));  | 
398  | 
val time_use_thy = warn_finished (gen_use_thy (require_thy true true true true false));  | 
|
399  | 
val use_thy_only = warn_finished (gen_use_thy (require_thy true false false true false));  | 
|
400  | 
val update_thy = warn_finished (gen_use_thy (require_thy true true false true true));  | 
|
401  | 
val update_thy_only = warn_finished (gen_use_thy (require_thy true false false true true));  | 
|
402  | 
val pretend_use_thy_only = warn_finished (gen_use_thy (require_thy false false false true false));  | 
|
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
403  | 
|
| 7211 | 404  | 
end;  | 
405  | 
||
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
406  | 
|
| 6666 | 407  | 
(* remove_thy *)  | 
408  | 
||
409  | 
fun remove_thy name =  | 
|
| 7910 | 410  | 
if is_finished name then error (loader_msg "cannot remove finished theory" [name])  | 
| 6666 | 411  | 
else  | 
412  | 
let val succs = thy_graph Graph.all_succs [name] in  | 
|
| 9778 | 413  | 
priority (loader_msg "removing" succs);  | 
| 15570 | 414  | 
List.app (perform Remove) succs;  | 
| 7191 | 415  | 
change_thys (Graph.del_nodes succs)  | 
| 6666 | 416  | 
end;  | 
417  | 
||
418  | 
||
| 7066 | 419  | 
(* begin / end theory *)  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
420  | 
|
| 17365 | 421  | 
fun check_uses name uses =  | 
422  | 
let val illegal = map (fn ext => Path.ext ext (Path.basic name)) ThyLoad.ml_exts in  | 
|
423  | 
(case find_first (member (op =) illegal o Path.base o Path.expand o #1) uses of  | 
|
424  | 
NONE => ()  | 
|
425  | 
    | SOME (path, _) => error ("Illegal use of theory ML file: " ^ quote (Path.pack path)))
 | 
|
426  | 
end;  | 
|
427  | 
||
428  | 
fun begin_theory present name parents uses int =  | 
|
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
429  | 
let  | 
| 15065 | 430  | 
val bparents = map base_of_path parents;  | 
| 
15158
 
2281784015a5
Fixed several bugs related to path specifications in theory names.
 
berghofe 
parents: 
15065 
diff
changeset
 | 
431  | 
val dir' = opt_path'' (lookup_deps name);  | 
| 19473 | 432  | 
val dir = the_default Path.current dir';  | 
| 17365 | 433  | 
val assert_thy = if int then quiet_update_thy' true dir else weak_use_thy dir;  | 
| 7244 | 434  | 
val _ = check_unfinished error name;  | 
| 15570 | 435  | 
val _ = List.app assert_thy parents;  | 
| 17365 | 436  | 
val _ = check_uses name uses;  | 
437  | 
||
| 16504 | 438  | 
val theory = Theory.begin_theory name (map get_theory bparents);  | 
| 7952 | 439  | 
val deps =  | 
440  | 
if known_thy name then get_deps name  | 
|
| 17365 | 441  | 
else (init_deps NONE (map #1 uses)); (*records additional ML files only!*)  | 
| 
19482
 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 
wenzelm 
parents: 
19473 
diff
changeset
 | 
442  | 
val uses_now = map_filter (fn (x, true) => SOME x | _ => NONE) uses;  | 
| 9451 | 443  | 
|
| 15531 | 444  | 
val _ = change_thys (update_node name bparents (deps, SOME (Theory.copy theory)));  | 
| 17365 | 445  | 
val theory' = theory |> present dir' name bparents uses;  | 
| 9451 | 446  | 
val _ = put_theory name (Theory.copy theory');  | 
| 17365 | 447  | 
val ((), theory'') = Context.pass_theory theory' (List.app (load_file false)) uses_now;  | 
| 9451 | 448  | 
val _ = put_theory name (Theory.copy theory'');  | 
| 8805 | 449  | 
in theory'' end;  | 
| 7244 | 450  | 
|
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
451  | 
fun end_theory theory =  | 
| 7099 | 452  | 
let  | 
| 16454 | 453  | 
val name = Context.theory_name theory;  | 
| 16504 | 454  | 
val theory' = Theory.end_theory theory;  | 
| 7099 | 455  | 
in put_theory name theory'; theory' end;  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
456  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
457  | 
|
| 6666 | 458  | 
(* finish all theories *)  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
459  | 
|
| 15531 | 460  | 
fun finish () = change_thys (Graph.map_nodes (fn (_, entry) => (NONE, entry)));  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
461  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
462  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
463  | 
(* register existing theories *)  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
464  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
465  | 
fun register_theory theory =  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
466  | 
let  | 
| 16454 | 467  | 
val name = Context.theory_name theory;  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
468  | 
val parents = Theory.parents_of theory;  | 
| 16454 | 469  | 
val parent_names = map Context.theory_name parents;  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
470  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
471  | 
fun err txt bads =  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
472  | 
error (loader_msg txt bads ^ "\n" ^ gen_msg "cannot register theory" [name]);  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
473  | 
|
| 6666 | 474  | 
val nonfinished = filter_out is_finished parent_names;  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
475  | 
fun get_variant (x, y_name) =  | 
| 15531 | 476  | 
if Theory.eq_thy (x, get_theory y_name) then NONE  | 
477  | 
else SOME y_name;  | 
|
| 
19482
 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 
wenzelm 
parents: 
19473 
diff
changeset
 | 
478  | 
val variants = map_filter get_variant (parents ~~ parent_names);  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
479  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
480  | 
fun register G =  | 
| 15531 | 481  | 
(Graph.new_node (name, (NONE, SOME theory)) G  | 
| 9327 | 482  | 
handle Graph.DUP _ => err "duplicate theory entry" [])  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
483  | 
|> add_deps name parent_names;  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
484  | 
in  | 
| 6666 | 485  | 
if not (null nonfinished) then err "non-finished parent theories" nonfinished  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
486  | 
else if not (null variants) then err "different versions of parent theories" variants  | 
| 7099 | 487  | 
else (change_thys register; perform Update name)  | 
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
488  | 
end;  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
489  | 
|
| 15801 | 490  | 
val _ = register_theory ProtoPure.thy;  | 
491  | 
||
| 
6211
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
492  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
493  | 
(*final declarations of this structure*)  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
494  | 
val theory = get_theory;  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
495  | 
val names = get_names;  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
496  | 
|
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
497  | 
end;  | 
| 
 
43d0efafa025
Theory loader database: theory and file dependencies, theory values
 
wenzelm 
parents: 
5211 
diff
changeset
 | 
498  | 
|
| 5209 | 499  | 
structure BasicThyInfo: BASIC_THY_INFO = ThyInfo;  | 
500  | 
open BasicThyInfo;  |