src/Pure/Thy/thy_read.ML
author clasohm
Fri, 15 Jul 1994 13:30:42 +0200
changeset 476 836cad329311
parent 426 767367131b47
child 559 00365d2e0c50
permissions -rw-r--r--
added check for concistency of filename and theory name; made loaded_thys a symtab instead of an association list; added store_thm, qed, get_thm, get_thms
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Thy/thy_read.ML
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
412
216624270b80 restored old functor name;
wenzelm
parents: 397
diff changeset
     3
    Author:     Sonia Mahjoub / Tobias Nipkow / L C Paulson / Carsten Clasohm
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
     4
    Copyright   1994  TU Muenchen
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
     5
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
     6
Reading and writing the theory definition files.
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
     7
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
     8
For theory XXX, the  input file is called XXX.thy
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
     9
                the output file is called .XXX.thy.ML
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    10
                and it then tries to read XXX.ML
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    11
*)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    12
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    13
datatype thy_info = ThyInfo of {path: string,
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    14
                                children: string list,
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    15
                                thy_time: string option,
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    16
                                ml_time: string option,
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    17
                                theory: Thm.theory option,
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    18
                                thms: thm Symtab.table};
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    19
412
216624270b80 restored old functor name;
wenzelm
parents: 397
diff changeset
    20
signature READTHY =
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    21
sig
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    22
  datatype basetype = Thy  of string
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    23
                    | File of string
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    24
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    25
  val loaded_thys    : thy_info Symtab.table ref
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    26
  val loadpath       : string list ref
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    27
  val delete_tmpfiles: bool ref
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    28
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    29
  val use_thy        : string -> unit
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    30
  val update         : unit -> unit
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    31
  val time_use_thy   : string -> unit
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    32
  val unlink_thy     : string -> unit
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    33
  val base_on        : basetype list -> string -> bool -> theory
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    34
  val store_theory   : theory * string -> unit
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    35
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    36
  val store_thm      : thm * string -> thm
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    37
  val qed            : string -> unit
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    38
  val get_thm        : theory -> string -> thm
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    39
  val get_thms       : theory -> (string * thm) list
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    40
end;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    41
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    42
412
216624270b80 restored old functor name;
wenzelm
parents: 397
diff changeset
    43
functor ReadthyFUN(structure ThySyn: THY_SYN): READTHY =
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    44
struct
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    45
open Symtab;
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    46
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    47
datatype basetype = Thy  of string
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    48
                  | File of string;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    49
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    50
val loaded_thys = ref (make [("Pure", ThyInfo {path = "", children = [], 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    51
                                       thy_time = Some "", ml_time = Some "", 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    52
                                       theory = Some pure_thy,
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    53
                                       thms = null})]);
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    54
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    55
val loadpath = ref ["."];           (*default search path for theory files *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    56
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    57
val delete_tmpfiles = ref true;         (*remove temporary files after use *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    58
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    59
(*Make name of the output ML file for a theory *)
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    60
fun out_name tname = "." ^ tname ^ ".thy.ML";
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    61
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    62
(*Read a file specified by thy_file containing theory thy *)
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    63
fun read_thy tname thy_file =
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    64
  let 
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    65
    val instream  = open_in thy_file;
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    66
    val outstream = open_out (out_name tname);
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    67
  in  
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    68
    output (outstream, ThySyn.parse tname (input (instream, 999999)));
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    69
    close_out outstream;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    70
    close_in instream
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    71
  end;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    72
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    73
fun file_exists file =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    74
  let val instream = open_in file in close_in instream; true end
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    75
    handle Io _ => false;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    76
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    77
(*Get thy_info for a loaded theory *)
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    78
fun get_thyinfo tname = lookup (!loaded_thys, tname);
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    79
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    80
(*Check if a theory was already loaded *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    81
fun already_loaded thy =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    82
  let val t = get_thyinfo thy
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    83
  in if is_none t then false
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    84
     else let val ThyInfo {thy_time, ml_time, ...} = the t
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    85
          in if is_none thy_time orelse is_none ml_time then false 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    86
             else true 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    87
          end
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    88
  end;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    89
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    90
(*Check if a theory file has changed since its last use.
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    91
  Return a pair of boolean values for .thy and for .ML *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    92
fun thy_unchanged thy thy_file ml_file = 
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    93
  let val t = get_thyinfo thy
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    94
  in if is_some t then
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    95
       let val ThyInfo {thy_time, ml_time, ...} = the t
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    96
           val tn = is_none thy_time;
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    97
           val mn = is_none ml_time
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
    98
       in if not tn andalso not mn then
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
    99
              ((file_info thy_file = the thy_time), 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   100
               (file_info ml_file = the ml_time))
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   101
          else if not tn andalso mn then (true, false)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   102
          else (false, false)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   103
       end
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   104
     else (false, false)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   105
  end;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   106
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   107
exception FILE_NOT_FOUND;   (*raised by find_file *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   108
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   109
(*Find a file using a list of paths if no absolute or relative path is
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   110
  specified.*)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   111
fun find_file "" name =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   112
      let fun find_it (curr :: paths) =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   113
                if file_exists (tack_on curr name) then
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   114
                    tack_on curr name
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   115
                else 
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   116
                    find_it paths
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   117
           | find_it [] = ""
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   118
      in find_it (!loadpath) end
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   119
  | find_file path name =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   120
      if file_exists (tack_on path name) then tack_on path name
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   121
                                         else "";
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   122
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   123
(*Get absolute pathnames for a new or already loaded theory *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   124
fun get_filenames path name =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   125
  let fun make_absolute file =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   126
        if file = "" then "" else 
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   127
            if hd (explode file) = "/" then file else tack_on (pwd ()) file;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   128
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   129
      fun new_filename () =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   130
        let val found = find_file path (name ^ ".thy")
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   131
                        handle FILE_NOT_FOUND => "";
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   132
            val thy_file = make_absolute found;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   133
            val (thy_path, _) = split_filename thy_file;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   134
            val found = find_file path (name ^ ".ML");
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   135
            val ml_file = if thy_file = "" then make_absolute found
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   136
                          else if file_exists (tack_on thy_path (name ^ ".ML"))
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   137
                          then tack_on thy_path (name ^ ".ML")
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   138
                          else "";
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   139
            val searched_dirs = if path = "" then (!loadpath) else [path]
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   140
        in if thy_file = "" andalso ml_file = "" then
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   141
             error ("Could not find file \"" ^ name ^ ".thy\" or \""
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   142
                    ^ name ^ ".ML\" for theory \"" ^ name ^ "\"\n"
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   143
                    ^ "in the following directories: \"" ^
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   144
                    (space_implode "\", \"" searched_dirs) ^ "\"")
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   145
           else ();
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   146
           (thy_file, ml_file) 
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   147
        end;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   148
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   149
      val tinfo = get_thyinfo name;
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   150
  in if is_some tinfo andalso path = "" then
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   151
       let val ThyInfo {path = abs_path, ...} = the tinfo;
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   152
           val (thy_file, ml_file) = if abs_path = "" then new_filename ()
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   153
                                     else (find_file abs_path (name ^ ".thy"),
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   154
                                           find_file abs_path (name ^ ".ML"))
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   155
       in if thy_file = "" andalso ml_file = "" then
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   156
            (writeln ("Warning: File \"" ^ (tack_on path name)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   157
                      ^ ".thy\"\ncontaining theory \"" ^ name
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   158
                      ^ "\" no longer exists.");
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   159
             new_filename ()
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   160
            )
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   161
          else (thy_file, ml_file)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   162
       end
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   163
     else new_filename ()
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   164
  end;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   165
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   166
(*Remove theory from all child lists in loaded_thys *)
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   167
fun unlink_thy tname =
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   168
  let fun remove (ThyInfo {path, children, thy_time, ml_time, theory, thms}) =
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   169
        ThyInfo {path = path, children = children \ tname, 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   170
                 thy_time = thy_time, ml_time = ml_time,
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   171
                 theory = theory, thms = thms}
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   172
  in loaded_thys := mapst remove (!loaded_thys) end;
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   173
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   174
(*Remove a theory from loaded_thys *)
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   175
fun remove_thy tname =
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   176
  loaded_thys := make (filter_out (fn (id, _) => id = tname)
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   177
                 (alist_of (!loaded_thys)));
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   178
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   179
(*Change thy_time and ml_time for an existent item *)
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   180
fun set_info thy_time ml_time tname =
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   181
  let val ThyInfo {path, children, theory, thms, ...} = 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   182
        the (lookup (!loaded_thys, tname));
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   183
  in loaded_thys := update ((tname, 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   184
       ThyInfo {path = path, children = children,
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   185
                thy_time = Some thy_time, ml_time = Some ml_time,
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   186
                theory = theory, thms = thms}), !loaded_thys)
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   187
  end;
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   188
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   189
(*Mark theory as changed since last read if it has been completly read *)
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   190
fun mark_outdated tname = 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   191
  if already_loaded tname then set_info "" "" tname else ();
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   192
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   193
(*Read .thy and .ML files that haven't been read yet or have changed since 
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   194
  they were last read;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   195
  loaded_thys is a thy_info list ref containing all theories that have 
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   196
  completly been read by this and preceeding use_thy calls.
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   197
  If a theory changed since its last use its children are marked as changed *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   198
fun use_thy name =
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   199
    let val (path, tname) = split_filename name;
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   200
        val (thy_file, ml_file) = get_filenames path tname;
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   201
        val (abs_path, _) = if thy_file = "" then split_filename ml_file
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   202
                            else split_filename thy_file;
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   203
        val (thy_uptodate, ml_uptodate) = thy_unchanged tname 
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   204
                                                        thy_file ml_file;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   205
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   206
         (*Set absolute path for loaded theory *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   207
         fun set_path () =
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   208
           let val ThyInfo {children, thy_time, ml_time, theory, thms, ...} = 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   209
                 the (lookup (!loaded_thys, tname));
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   210
           in loaded_thys := update ((tname, 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   211
                               ThyInfo {path = abs_path, children = children,
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   212
                                        thy_time = thy_time, ml_time = ml_time,
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   213
                                        theory = theory, thms = thms}),
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   214
                               !loaded_thys)
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   215
           end;
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   216
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   217
         (*Mark all direct descendants of a theory as changed *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   218
         fun mark_children thy =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   219
           let val ThyInfo {children, ...} = the (get_thyinfo thy)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   220
               val loaded = filter already_loaded children
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   221
           in if loaded <> [] then
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   222
                  (writeln ("The following children of theory " ^ (quote thy)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   223
                            ^ " are now out-of-date: "
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   224
                            ^ (quote (space_implode "\",\"" loaded)));
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   225
                   seq mark_outdated loaded
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   226
                  )
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   227
              else ()
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   228
           end;
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   229
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   230
        (*Remove all theorems associated with a theory*)
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   231
        fun delete_thms () =
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   232
          let val tinfo = case lookup (!loaded_thys, tname) of 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   233
             Some (ThyInfo {path, children, thy_time, ml_time, theory, ...}) =>
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   234
                 ThyInfo {path = path, children = children,
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   235
                          thy_time = thy_time, ml_time = ml_time,
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   236
                          theory = theory, thms = null}
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   237
           | None => ThyInfo {path = "", children = [],
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   238
                              thy_time = None, ml_time = None,
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   239
                              theory = None, thms = null};
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   240
         in loaded_thys := update ((tname, tinfo), !loaded_thys) end;
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   241
    in if thy_uptodate andalso ml_uptodate then ()
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   242
       else
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   243
       (
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   244
         delete_thms ();
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   245
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   246
         if thy_uptodate orelse thy_file = "" then ()
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   247
         else (writeln ("Reading \"" ^ name ^ ".thy\"");
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   248
               read_thy tname thy_file;
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   249
               use (out_name tname)
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   250
              );
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   251
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   252
         if ml_file = "" then () 
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   253
         else (writeln ("Reading \"" ^ name ^ ".ML\"");
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   254
               use ml_file);
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   255
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   256
         use_string ["store_theory (" ^ tname ^ ".thy, " ^ quote tname ^ ");"];
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   257
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   258
         (*Now set the correct info*)
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   259
         set_info (file_info thy_file) (file_info ml_file) tname;
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   260
         set_path ();
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   261
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   262
         (*Mark theories that have to be reloaded*)
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   263
         mark_children tname;
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   264
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   265
         (*Remove temporary files*)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   266
         if not (!delete_tmpfiles) orelse (thy_file = "") orelse thy_uptodate 
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   267
           then ()
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   268
         else delete_file (out_name tname)
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   269
        )
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   270
    end;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   271
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   272
fun time_use_thy tname = timeit(fn()=>
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   273
   (writeln("\n**** Starting Theory " ^ tname ^ " ****");  
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   274
    use_thy tname;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   275
    writeln("\n**** Finished Theory " ^ tname ^ " ****"))
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   276
   );
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   277
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   278
(*Load all thy or ML files that have been changed and also
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   279
  all theories that depend on them *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   280
fun update () =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   281
  let (*List theories in the order they have to be loaded *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   282
      fun load_order [] result = result
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   283
        | load_order thys result =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   284
            let fun next_level (t :: ts) =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   285
                      let val thy = get_thyinfo t
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   286
                      in if is_some thy then
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   287
                             let val ThyInfo {children, ...} = the thy
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   288
                             in children union (next_level ts) end
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   289
                         else next_level ts
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   290
                      end
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   291
                  | next_level [] = [];
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   292
                  
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   293
                val children = next_level thys;
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   294
            in load_order children ((result \\ children) @ children) end;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   295
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   296
      fun reload_changed (t :: ts) =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   297
            let val thy = get_thyinfo t;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   298
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   299
                fun abspath () =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   300
                  if is_some thy then
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   301
                    let val ThyInfo {path, ...} = the thy in path end
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   302
                  else "";
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   303
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   304
                val (thy_file, ml_file) = get_filenames (abspath ()) t;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   305
                val (thy_uptodate, ml_uptodate) =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   306
                        thy_unchanged t thy_file ml_file;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   307
            in if thy_uptodate andalso ml_uptodate then ()
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   308
                                                   else use_thy t;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   309
               reload_changed ts
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   310
            end
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   311
        | reload_changed [] = ();
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   312
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   313
     (*Remove all theories that are no descendants of Pure.
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   314
       If there are still children in the deleted theory's list
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   315
       schedule them for reloading *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   316
     fun collect_garbage not_garbage =
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   317
       let fun collect ((tname, ThyInfo {children, ...}) :: ts) =
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   318
                 if tname mem not_garbage then collect ts
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   319
                 else (writeln ("Theory \"" ^ tname 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   320
                         ^ "\" is no longer linked with Pure - removing it.");
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   321
                       remove_thy tname;
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   322
                       seq mark_outdated children)
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   323
             | collect [] = ()
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   324
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   325
       in collect (alist_of (!loaded_thys)) end;
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   326
  in collect_garbage ("Pure" :: (load_order ["Pure"] []));
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   327
     reload_changed (load_order ["Pure"] [])
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   328
  end;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   329
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   330
(*Merge theories to build a base for a new theory.
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   331
  Base members are only loaded if they are missing. *)
424
f9d7e4fe141a base_on: added 'mk_draft' arg;
wenzelm
parents: 412
diff changeset
   332
fun base_on bases child mk_draft =
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   333
      let (*List all descendants of a theory list *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   334
          fun list_descendants (t :: ts) =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   335
                let val tinfo = get_thyinfo t
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   336
                in if is_some tinfo then
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   337
                     let val ThyInfo {children, ...} = the tinfo
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   338
                     in children union (list_descendants (ts union children))
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   339
                     end
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   340
                   else []
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   341
                end
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   342
            | list_descendants [] = [];
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   343
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   344
          (*Show the cycle that would be created by add_child *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   345
          fun show_cycle base =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   346
            let fun find_it result curr =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   347
                  let val tinfo = get_thyinfo curr
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   348
                  in if base = curr then 
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   349
                       error ("Cyclic dependency of theories: "
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   350
                              ^ child ^ "->" ^ base ^ result)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   351
                     else if is_some tinfo then
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   352
                       let val ThyInfo {children, ...} = the tinfo
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   353
                       in seq (find_it ("->" ^ curr ^ result)) children
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   354
                       end
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   355
                     else ()
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   356
                  end
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   357
            in find_it "" child end;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   358
        
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   359
          (*Check if a cycle would be created by add_child *)
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   360
          fun find_cycle base =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   361
            if base mem (list_descendants [child]) then show_cycle base
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   362
            else ();
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   363
                   
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   364
          (*Add child to child list of base *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   365
          fun add_child base =
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   366
            let val tinfo =
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   367
                  case lookup (!loaded_thys, base) of
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   368
                      Some (ThyInfo {path, children, thy_time, ml_time, 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   369
                                     theory, thms}) =>
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   370
                        ThyInfo {path = path, children = child ins children,
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   371
                                 thy_time = thy_time, ml_time = ml_time,
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   372
                                 theory = theory, thms = thms}
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   373
                    | None => ThyInfo {path = "", children = [child],
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   374
                                       thy_time = None, ml_time = None, 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   375
                                       theory = None, thms = null};
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   376
            in loaded_thys := Symtab.update ((base, tinfo), !loaded_thys) end;
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   377
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   378
          (*Load a base theory if not already done
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   379
            and no cycle would be created *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   380
          fun load base =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   381
              let val thy_present = already_loaded base
426
767367131b47 replaced "foldl merge_theories" by "merge_thy_list" in base_on
clasohm
parents: 424
diff changeset
   382
                                           (*test this before child is added *)
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   383
              in
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   384
                if child = base then
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   385
                    error ("Cyclic dependency of theories: " ^ child
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   386
                           ^ "->" ^ child)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   387
                else 
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   388
                  (find_cycle base;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   389
                   add_child base;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   390
                   if thy_present then ()
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   391
                   else (writeln ("Autoloading theory " ^ (quote base)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   392
                                  ^ " (used by " ^ (quote child) ^ ")");
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   393
                         use_thy base)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   394
                  )
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   395
              end; 
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   396
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   397
          (*Load all needed files and make a list of all real theories *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   398
          fun load_base (Thy b :: bs) =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   399
               (load b;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   400
                b :: (load_base bs))
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   401
            | load_base (File b :: bs) =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   402
               (load b;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   403
                load_base bs)    (*don't add it to merge_theories' parameter *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   404
            | load_base [] = [];
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   405
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   406
          (*Get theory object for a loaded theory *)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   407
          fun get_theory name =
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   408
            let val ThyInfo {theory, ...} = the (get_thyinfo name)
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   409
            in the theory end;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   410
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   411
          val mergelist = (unlink_thy child;
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   412
                           load_base bases);
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   413
     in writeln ("Loading theory " ^ (quote child));
426
767367131b47 replaced "foldl merge_theories" by "merge_thy_list" in base_on
clasohm
parents: 424
diff changeset
   414
        merge_thy_list mk_draft (map get_theory mergelist) end;
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   415
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   416
(*Change theory object for an existent item of loaded_thys 
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   417
  or create a new item *)
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   418
fun store_theory (thy, tname) =
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   419
  let val tinfo = case lookup (!loaded_thys, tname) of 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   420
               Some (ThyInfo {path, children, thy_time, ml_time, thms, ...}) =>
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   421
                 ThyInfo {path = path, children = children,
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   422
                          thy_time = thy_time, ml_time = ml_time,
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   423
                          theory = Some thy, thms = thms}
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   424
             | None => ThyInfo {path = "", children = [],
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   425
                                thy_time = Some "", ml_time = Some "",
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   426
                                theory = Some thy, thms = null};
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   427
  in loaded_thys := Symtab.update ((tname, tinfo), !loaded_thys) end;
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   428
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   429
(*Store a theorem in the ThyInfo of the theory it is associated with*)
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   430
fun store_thm (thm, tname) =
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   431
  let val thy_name = !(hd (stamps_of_thm thm));
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   432
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   433
      val ThyInfo {path, children, thy_time, ml_time, theory, thms} =
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   434
        case get_thyinfo thy_name of
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   435
            Some tinfo => tinfo
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   436
          | None => error ("store_thm: Theory \"" ^ thy_name 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   437
                           ^ "\" is not stored in loaded_thys");
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   438
  in loaded_thys := 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   439
       Symtab.update ((thy_name, ThyInfo {path = path, children = children,
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   440
                                   thy_time = thy_time, ml_time = ml_time,
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   441
                                   theory = theory, 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   442
                                   thms = Symtab.update ((tname, thm), thms)}),
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   443
                      !loaded_thys);
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   444
     thm
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   445
  end;
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   446
476
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   447
(*Store theorem in loaded_thys and a ML variable*)
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   448
fun qed name = use_string ["val " ^ name ^ " = store_thm (result(), "
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   449
                           ^ quote name ^ ");"];
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   450
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   451
fun name_of_thy thy = !(hd (stamps_of_thy thy));
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   452
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   453
(*Retrieve a theorem specified by theory and name*)
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   454
fun get_thm thy tname =
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   455
  let val thy_name = name_of_thy thy;
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   456
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   457
      val ThyInfo {thms, ...} = 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   458
        case get_thyinfo thy_name of
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   459
            Some tinfo => tinfo
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   460
          | None => error ("get_thm: Theory \"" ^ thy_name
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   461
                           ^ "\" is not stored in loaded_thys");
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   462
  in the (lookup (thms, tname)) end;
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   463
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   464
(*Retrieve all theorems belonging to the specified theory*)
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   465
fun get_thms thy =
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   466
  let val thy_name = name_of_thy thy;
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   467
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   468
      val ThyInfo {thms, ...} = 
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   469
        case get_thyinfo thy_name of
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   470
            Some tinfo => tinfo
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   471
          | None => error ("get_thms: Theory \"" ^ thy_name
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   472
                           ^ "\" is not stored in loaded_thys");
836cad329311 added check for concistency of filename and theory name;
clasohm
parents: 426
diff changeset
   473
  in alist_of thms end;
391
e960fe156cd8 (was Thy/read.ML)
wenzelm
parents:
diff changeset
   474
end;