src/Pure/Interface/proof_general.ML
author wenzelm
Fri, 21 Dec 2001 23:20:29 +0100
changeset 12592 0eb1685a00b4
parent 12424 3c70d99b7586
child 12602 6984018a98e3
permissions -rw-r--r--
restart: sync_thy_loader instead of overly aggressive touch_all_thys; provisions for persistent sessions;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Interface/proof_general.ML
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
     3
    Author:     Markus Wenzel, TU Muenchen
9507
wenzelm
parents: 9497
diff changeset
     4
    License:    GPL (GNU GENERAL PUBLIC LICENSE)
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
     5
10078
8bb4b66cd6b5 updated url;
wenzelm
parents: 9979
diff changeset
     6
Isabelle configuration for Proof General (see http://www.proofgeneral.org).
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
     7
*)
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
     8
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
     9
signature PROOF_GENERAL =
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    10
sig
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    11
  val setup: (theory -> theory) list
7954
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
    12
  val update_thy_only: string -> unit
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
    13
  val try_update_thy_only: string -> unit
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
    14
  val inform_file_processed: string -> unit
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
    15
  val inform_file_retracted: string -> unit
11017
241cbdf4134e thms_containing: term args;
wenzelm
parents: 10954
diff changeset
    16
  val thms_containing: string list -> unit
7193
cc7a89d233f7 proper ProofGeneral/isa setup;
wenzelm
parents: 7100
diff changeset
    17
  val help: unit -> unit
cc7a89d233f7 proper ProofGeneral/isa setup;
wenzelm
parents: 7100
diff changeset
    18
  val show_context: unit -> theory
cc7a89d233f7 proper ProofGeneral/isa setup;
wenzelm
parents: 7100
diff changeset
    19
  val kill_goal: unit -> unit
cc7a89d233f7 proper ProofGeneral/isa setup;
wenzelm
parents: 7100
diff changeset
    20
  val repeat_undo: int -> unit
7235
3c3defaad8ae Goals.reset_goals;
wenzelm
parents: 7210
diff changeset
    21
  val isa_restart: unit -> unit
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    22
  val init: bool -> unit
12217
e3efc5c9f267 write_keywords: string argument (logic name);
wenzelm
parents: 11888
diff changeset
    23
  val write_keywords: string -> unit
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    24
end;
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    25
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    26
structure ProofGeneral: PROOF_GENERAL =
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    27
struct
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    28
12422
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    29
(* print modes *)
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    30
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    31
val proof_generalN = "ProofGeneral";
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    32
val xsymbolsN = "xsymbols";
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    33
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    34
val pgmlN = "PGML";
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    35
fun pgml () = pgmlN mem_string ! print_mode;
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    36
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    37
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    38
(* text output *)
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    39
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    40
local
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    41
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    42
fun xsymbols_output s =
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    43
  if xsymbolsN mem_string ! print_mode andalso exists_string (equal "\\") s then
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    44
    let val syms = Symbol.explode s
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    45
    in (implode (map (fn "\\" => "\\\\" | c => c) syms), real (Symbol.length syms)) end
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    46
  else (s, real (size s));
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    47
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    48
fun pgml_output (s, len) =
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    49
  if pgml () then (XML.text s, len)
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    50
  else (s, len);
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    51
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    52
in
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    53
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    54
fun setup_xsymbols_output () =
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    55
  Symbol.add_mode proof_generalN (pgml_output o xsymbols_output, Symbol.default_indent);
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    56
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    57
end;
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    58
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    59
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    60
(* token translations *)
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    61
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    62
local
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    63
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    64
val end_tag = oct_char "350";
12422
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    65
val class_tag = ("class", oct_char "351");
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    66
val tfree_tag = ("tfree", oct_char "352");
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    67
val tvar_tag = ("tvar", oct_char "353");
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    68
val free_tag = ("free", oct_char "354");
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    69
val bound_tag = ("bound", oct_char "355");
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    70
val var_tag = ("var", oct_char "356");
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    71
val skolem_tag = ("skolem", oct_char "357");
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    72
12422
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    73
fun xml_atom kind x = XML.element "atom" [("kind", kind)] [XML.text x];
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    74
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    75
fun tagit (kind, bg_tag) x =
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    76
  (if pgml () then xml_atom kind x else bg_tag ^ x ^ end_tag,
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    77
    real (Symbol.length (Symbol.explode x)));
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    78
9918
dab013ea6b63 proper markup of schematic (!) skolems;
wenzelm
parents: 9821
diff changeset
    79
fun free_or_skolem x =
7597
4fbdb8a0c378 skolem_tag;
wenzelm
parents: 7581
diff changeset
    80
  (case try Syntax.dest_skolem x of
9918
dab013ea6b63 proper markup of schematic (!) skolems;
wenzelm
parents: 9821
diff changeset
    81
    None => tagit free_tag x
7597
4fbdb8a0c378 skolem_tag;
wenzelm
parents: 7581
diff changeset
    82
  | Some x' => tagit skolem_tag x');
4fbdb8a0c378 skolem_tag;
wenzelm
parents: 7581
diff changeset
    83
9918
dab013ea6b63 proper markup of schematic (!) skolems;
wenzelm
parents: 9821
diff changeset
    84
fun var_or_skolem s =
dab013ea6b63 proper markup of schematic (!) skolems;
wenzelm
parents: 9821
diff changeset
    85
  (case Syntax.read_var s of
dab013ea6b63 proper markup of schematic (!) skolems;
wenzelm
parents: 9821
diff changeset
    86
    Var ((x, i), _) =>
dab013ea6b63 proper markup of schematic (!) skolems;
wenzelm
parents: 9821
diff changeset
    87
      (case try Syntax.dest_skolem x of
dab013ea6b63 proper markup of schematic (!) skolems;
wenzelm
parents: 9821
diff changeset
    88
        None => tagit var_tag s
dab013ea6b63 proper markup of schematic (!) skolems;
wenzelm
parents: 9821
diff changeset
    89
      | Some x' => tagit skolem_tag (Syntax.string_of_vname (x', i)))
dab013ea6b63 proper markup of schematic (!) skolems;
wenzelm
parents: 9821
diff changeset
    90
  | _ => tagit var_tag s);
dab013ea6b63 proper markup of schematic (!) skolems;
wenzelm
parents: 9821
diff changeset
    91
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    92
val proof_general_trans =
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    93
 Syntax.tokentrans_mode proof_generalN
12422
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
    94
  [("class", tagit class_tag),
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    95
   ("tfree", tagit tfree_tag),
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    96
   ("tvar", tagit tvar_tag),
9918
dab013ea6b63 proper markup of schematic (!) skolems;
wenzelm
parents: 9821
diff changeset
    97
   ("free", free_or_skolem),
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
    98
   ("bound", tagit bound_tag),
9918
dab013ea6b63 proper markup of schematic (!) skolems;
wenzelm
parents: 9821
diff changeset
    99
   ("var", var_or_skolem)];
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
   100
12422
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   101
in val setup = [Theory.add_tokentrfuns proof_general_trans] end;
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
   102
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
   103
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
   104
12422
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   105
(* messages and notification *)
8445
86e99f863932 proper symbol_output for "xsymbols" mode;
wenzelm
parents: 8331
diff changeset
   106
12422
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   107
local
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   108
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   109
fun decorated_output bg en prfx =
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   110
  writeln_default o enclose bg en o prefix_lines prfx;
8445
86e99f863932 proper symbol_output for "xsymbols" mode;
wenzelm
parents: 8331
diff changeset
   111
12422
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   112
fun message kind bg en prfx s =
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   113
  if pgml () then writeln_default (XML.element kind [] [prefix_lines prfx s])
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   114
  else decorated_output bg en prfx s;
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
   115
12422
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   116
val notify = message "notify" (oct_char "360") (oct_char "361") "";
7193
cc7a89d233f7 proper ProofGeneral/isa setup;
wenzelm
parents: 7100
diff changeset
   117
12422
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   118
in
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
   119
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
   120
fun setup_messages () =
12422
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   121
 (writeln_fn := message "output" "" "" "";
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   122
  priority_fn := message "information" (oct_char "360") (oct_char "361") "";
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   123
  tracing_fn := message "tracing" (oct_char "360") (oct_char "361") (oct_char "375");
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   124
  warning_fn := message "warning" (oct_char "362") (oct_char "363") "### ";
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   125
  error_fn := message "error" (oct_char "364") (oct_char "365") "*** ");
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
   126
12422
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   127
fun tell_clear_goals () = notify "Proof General, please clear the goals buffer.";
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   128
fun tell_clear_response () = notify "Proof General, please clear the response buffer.";
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   129
fun tell_file msg path = notify ("Proof General, " ^ msg ^ " " ^ quote (File.sysify_path path));
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   130
12422
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   131
end;
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   132
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   133
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   134
(* theory / proof state output *)
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
   135
12422
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   136
local
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   137
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   138
fun tmp_markers f =
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   139
  setmp Display.current_goals_markers (oct_char "366", oct_char "367", "") f ();
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   140
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   141
fun statedisplay prts =
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   142
  writeln_default (XML.element "statedisplay" [] [Pretty.string_of (Pretty.chunks prts)]);
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   143
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   144
fun print_current_goals n m st =
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   145
  if pgml () then statedisplay (Display.pretty_current_goals n m st)
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   146
  else tmp_markers (fn () => Display.print_current_goals_default n m st);
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   147
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   148
fun print_state b st =
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   149
  if pgml () then statedisplay (Toplevel.pretty_state b st)
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   150
  else tmp_markers (fn () => Toplevel.print_state_default b st);
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   151
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   152
in
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   153
7939
wenzelm
parents: 7937
diff changeset
   154
fun setup_state () =
12422
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   155
 (Display.print_current_goals_fn := print_current_goals;
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   156
  Toplevel.print_state_fn := print_state;
9761
21a11b9da318 improved handling of messages: do not decorate writeln output;
wenzelm
parents: 9697
diff changeset
   157
  Toplevel.prompt_state_fn := (suffix (oct_char "372") o Toplevel.prompt_state_default));
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
   158
12422
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   159
end;
7389066a4df9 optional PGML markup;
wenzelm
parents: 12363
diff changeset
   160
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
   161
7100
4f777a0e1c8b setup_thy_loader;
wenzelm
parents: 7027
diff changeset
   162
(* theory loader actions *)
4f777a0e1c8b setup_thy_loader;
wenzelm
parents: 7027
diff changeset
   163
4f777a0e1c8b setup_thy_loader;
wenzelm
parents: 7027
diff changeset
   164
local
4f777a0e1c8b setup_thy_loader;
wenzelm
parents: 7027
diff changeset
   165
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   166
fun add_master_files name files =
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   167
  let val masters = [ThyLoad.thy_path name, ThyLoad.ml_path name]
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   168
  in masters @ gen_rems (op = o pairself Path.base) (files, masters) end;
7100
4f777a0e1c8b setup_thy_loader;
wenzelm
parents: 7027
diff changeset
   169
7893
fef0738b62d7 eliminated isar_action;
wenzelm
parents: 7610
diff changeset
   170
fun trace_action action name =
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   171
  if action = ThyInfo.Update then
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   172
    seq (tell_file "this file is loaded:") (ThyInfo.loaded_files name)
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   173
  else if action = ThyInfo.Outdate orelse action = ThyInfo.Remove then
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   174
    seq (tell_file "you can unlock the file") (add_master_files name (ThyInfo.loaded_files name))
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   175
  else ();
7193
cc7a89d233f7 proper ProofGeneral/isa setup;
wenzelm
parents: 7100
diff changeset
   176
7100
4f777a0e1c8b setup_thy_loader;
wenzelm
parents: 7027
diff changeset
   177
in
7893
fef0738b62d7 eliminated isar_action;
wenzelm
parents: 7610
diff changeset
   178
  fun setup_thy_loader () = ThyInfo.add_hook trace_action;
12592
0eb1685a00b4 restart: sync_thy_loader instead of overly aggressive touch_all_thys;
wenzelm
parents: 12424
diff changeset
   179
  fun sync_thy_loader () = seq (trace_action ThyInfo.Update) (ThyInfo.names ());
7100
4f777a0e1c8b setup_thy_loader;
wenzelm
parents: 7027
diff changeset
   180
end;
4f777a0e1c8b setup_thy_loader;
wenzelm
parents: 7027
diff changeset
   181
4f777a0e1c8b setup_thy_loader;
wenzelm
parents: 7027
diff changeset
   182
7954
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   183
(* prepare theory context *)
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   184
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   185
val thy_name = Path.pack o Path.drop_ext o Path.base o Path.unpack;
10417
42e6b8502d52 Moved rewriting functions from Thm to MetaSimplifier.
berghofe
parents: 10246
diff changeset
   186
val update_thy_only = setmp MetaSimplifier.trace_simp false ThyInfo.update_thy_only;
7954
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   187
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   188
fun which_context () =
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   189
  (case Context.get_context () of
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   190
    Some thy => "  Using current (dynamic!) one: " ^
7956
edaca60a54cd tuned msg;
wenzelm
parents: 7954
diff changeset
   191
      (case try PureThy.get_name thy of Some name => quote name | None => "<unnamed>")
7954
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   192
  | None => "");
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   193
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   194
fun try_update_thy_only file =
9662
896f5c5cfc56 cond_add_path;
wenzelm
parents: 9514
diff changeset
   195
  ThyLoad.cond_add_path (Path.dir (Path.unpack file)) (fn () =>
7954
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   196
    let val name = thy_name file in
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   197
      if is_some (ThyLoad.check_file (ThyLoad.thy_path name)) then update_thy_only name
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   198
      else warning ("Unkown theory context of ML file." ^ which_context ())
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   199
    end) ();
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   200
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   201
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   202
(* get informed about files *)
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   203
9821
095beeef58ae proper_inform_file_processed: ThyInfo.pretend_use_thy_only;
wenzelm
parents: 9775
diff changeset
   204
val touch_child_thys = ThyInfo.if_known_thy ThyInfo.touch_child_thys;
095beeef58ae proper_inform_file_processed: ThyInfo.pretend_use_thy_only;
wenzelm
parents: 9775
diff changeset
   205
095beeef58ae proper_inform_file_processed: ThyInfo.pretend_use_thy_only;
wenzelm
parents: 9775
diff changeset
   206
val inform_file_processed = touch_child_thys o thy_name;
095beeef58ae proper_inform_file_processed: ThyInfo.pretend_use_thy_only;
wenzelm
parents: 9775
diff changeset
   207
val inform_file_retracted = touch_child_thys o thy_name;
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   208
9821
095beeef58ae proper_inform_file_processed: ThyInfo.pretend_use_thy_only;
wenzelm
parents: 9775
diff changeset
   209
fun proper_inform_file_processed file state =
095beeef58ae proper_inform_file_processed: ThyInfo.pretend_use_thy_only;
wenzelm
parents: 9775
diff changeset
   210
  let val name = thy_name file in
095beeef58ae proper_inform_file_processed: ThyInfo.pretend_use_thy_only;
wenzelm
parents: 9775
diff changeset
   211
    touch_child_thys name;
095beeef58ae proper_inform_file_processed: ThyInfo.pretend_use_thy_only;
wenzelm
parents: 9775
diff changeset
   212
    if not (Toplevel.is_toplevel state) then
095beeef58ae proper_inform_file_processed: ThyInfo.pretend_use_thy_only;
wenzelm
parents: 9775
diff changeset
   213
      warning ("Not at toplevel -- cannot register theory " ^ quote name)
095beeef58ae proper_inform_file_processed: ThyInfo.pretend_use_thy_only;
wenzelm
parents: 9775
diff changeset
   214
    else Library.transform_error ThyInfo.pretend_use_thy_only name handle ERROR_MESSAGE msg =>
095beeef58ae proper_inform_file_processed: ThyInfo.pretend_use_thy_only;
wenzelm
parents: 9775
diff changeset
   215
      (warning msg; warning ("Failed to register theory " ^ quote name))
095beeef58ae proper_inform_file_processed: ThyInfo.pretend_use_thy_only;
wenzelm
parents: 9775
diff changeset
   216
  end;
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   217
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   218
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   219
(* misc commands for ProofGeneral/isa *)
7193
cc7a89d233f7 proper ProofGeneral/isa setup;
wenzelm
parents: 7100
diff changeset
   220
11017
241cbdf4134e thms_containing: term args;
wenzelm
parents: 10954
diff changeset
   221
fun thms_containing ss =
241cbdf4134e thms_containing: term args;
wenzelm
parents: 10954
diff changeset
   222
  let
241cbdf4134e thms_containing: term args;
wenzelm
parents: 10954
diff changeset
   223
    val thy = the_context ();
241cbdf4134e thms_containing: term args;
wenzelm
parents: 10954
diff changeset
   224
    fun read_term s = Thm.term_of (Thm.read_cterm (Theory.sign_of thy) (s, TypeInfer.logicT));
241cbdf4134e thms_containing: term args;
wenzelm
parents: 10954
diff changeset
   225
  in ThmDatabase.print_thms_containing thy (map read_term ss) end;
7579
20adf381fb0a added thms_containing;
wenzelm
parents: 7407
diff changeset
   226
9775
da698a96c4f3 priority_fn := decorate_lines;
wenzelm
parents: 9761
diff changeset
   227
val welcome = priority o Session.welcome;
9761
21a11b9da318 improved handling of messages: do not decorate writeln output;
wenzelm
parents: 9697
diff changeset
   228
val help = welcome;
7193
cc7a89d233f7 proper ProofGeneral/isa setup;
wenzelm
parents: 7100
diff changeset
   229
val show_context = Context.the_context;
cc7a89d233f7 proper ProofGeneral/isa setup;
wenzelm
parents: 7100
diff changeset
   230
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   231
fun kill_goal () = (Goals.reset_goals (); tell_clear_goals ());
7193
cc7a89d233f7 proper ProofGeneral/isa setup;
wenzelm
parents: 7100
diff changeset
   232
11888
7099c865de3b Display.print_current_goals_fn;
wenzelm
parents: 11510
diff changeset
   233
fun no_print_goals f = setmp Display.print_current_goals_fn (fn _ => fn _ => fn _ => ()) f;
7922
b284079cd902 tuned repeat_undo;
wenzelm
parents: 7911
diff changeset
   234
7193
cc7a89d233f7 proper ProofGeneral/isa setup;
wenzelm
parents: 7100
diff changeset
   235
fun repeat_undo 0 = ()
7922
b284079cd902 tuned repeat_undo;
wenzelm
parents: 7911
diff changeset
   236
  | repeat_undo 1 = undo ()
b284079cd902 tuned repeat_undo;
wenzelm
parents: 7911
diff changeset
   237
  | repeat_undo n = (no_print_goals undo (); repeat_undo (n - 1));
7193
cc7a89d233f7 proper ProofGeneral/isa setup;
wenzelm
parents: 7100
diff changeset
   238
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   239
12592
0eb1685a00b4 restart: sync_thy_loader instead of overly aggressive touch_all_thys;
wenzelm
parents: 12424
diff changeset
   240
(* restart top-level loop (keeps most state information) *)
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   241
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   242
local
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   243
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   244
fun restart isar =
9497
01d0c66ce523 isa: do not touch_all_thys on startup;
wenzelm
parents: 9462
diff changeset
   245
 (if isar then tell_clear_goals () else kill_goal ();
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   246
  tell_clear_response ();
9761
21a11b9da318 improved handling of messages: do not decorate writeln output;
wenzelm
parents: 9697
diff changeset
   247
  welcome ());
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   248
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   249
in
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   250
12592
0eb1685a00b4 restart: sync_thy_loader instead of overly aggressive touch_all_thys;
wenzelm
parents: 12424
diff changeset
   251
fun isa_restart () = restart false;
0eb1685a00b4 restart: sync_thy_loader instead of overly aggressive touch_all_thys;
wenzelm
parents: 12424
diff changeset
   252
fun isar_restart () = (sync_thy_loader (); restart true; raise Toplevel.RESTART);
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   253
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   254
end;
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   255
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   256
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   257
(* outer syntax *)
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   258
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   259
local structure P = OuterParse and K = OuterSyntax.Keyword in
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   260
9821
095beeef58ae proper_inform_file_processed: ThyInfo.pretend_use_thy_only;
wenzelm
parents: 9775
diff changeset
   261
val old_undoP = (*same name for compatibility with PG/Isabelle99*)
8452
59d66fe9bbb9 silence undo command;
wenzelm
parents: 8445
diff changeset
   262
  OuterSyntax.improper_command "undo" "undo last command (no output)" K.control
9010
ce78dc5e1a73 Toplevel.no_timing;
wenzelm
parents: 8990
diff changeset
   263
    (Scan.succeed (Toplevel.no_timing o IsarCmd.undo));
8452
59d66fe9bbb9 silence undo command;
wenzelm
parents: 8445
diff changeset
   264
8647
656f1b61875a added ProofGeneral.undo;
wenzelm
parents: 8495
diff changeset
   265
val undoP =
9514
wenzelm
parents: 9507
diff changeset
   266
  OuterSyntax.improper_command "ProofGeneral.undo" "(internal)" K.control
9010
ce78dc5e1a73 Toplevel.no_timing;
wenzelm
parents: 8990
diff changeset
   267
    (Scan.succeed (Toplevel.no_timing o IsarCmd.undo));
8647
656f1b61875a added ProofGeneral.undo;
wenzelm
parents: 8495
diff changeset
   268
7954
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   269
val context_thy_onlyP =
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   270
  OuterSyntax.improper_command "ProofGeneral.context_thy_only" "(internal)" K.control
9010
ce78dc5e1a73 Toplevel.no_timing;
wenzelm
parents: 8990
diff changeset
   271
    (P.name >> (Toplevel.no_timing oo IsarThy.init_context update_thy_only));
7954
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   272
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   273
val try_context_thy_onlyP =
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   274
  OuterSyntax.improper_command "ProofGeneral.try_context_thy_only" "(internal)" K.control
9010
ce78dc5e1a73 Toplevel.no_timing;
wenzelm
parents: 8990
diff changeset
   275
    (P.name >> (Toplevel.no_timing oo
ce78dc5e1a73 Toplevel.no_timing;
wenzelm
parents: 8990
diff changeset
   276
      (Toplevel.imperative (K ()) oo IsarThy.init_context try_update_thy_only)));
7954
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   277
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   278
val restartP =
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   279
  OuterSyntax.improper_command "ProofGeneral.restart" "(internal)" K.control
9010
ce78dc5e1a73 Toplevel.no_timing;
wenzelm
parents: 8990
diff changeset
   280
    (P.opt_unit >> (Toplevel.no_timing oo K (Toplevel.imperative isar_restart)));
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   281
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   282
val kill_proofP =
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   283
  OuterSyntax.improper_command "ProofGeneral.kill_proof" "(internal)" K.control
9010
ce78dc5e1a73 Toplevel.no_timing;
wenzelm
parents: 8990
diff changeset
   284
    (Scan.succeed (Toplevel.no_timing o IsarCmd.kill_proof_notify tell_clear_goals));
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   285
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   286
val inform_file_processedP =
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   287
  OuterSyntax.improper_command "ProofGeneral.inform_file_processed" "(internal)" K.control
9010
ce78dc5e1a73 Toplevel.no_timing;
wenzelm
parents: 8990
diff changeset
   288
    (P.name >> (Toplevel.no_timing oo
9821
095beeef58ae proper_inform_file_processed: ThyInfo.pretend_use_thy_only;
wenzelm
parents: 9775
diff changeset
   289
      (fn name => Toplevel.keep (proper_inform_file_processed name))));
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   290
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   291
val inform_file_retractedP =
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   292
  OuterSyntax.improper_command "ProofGeneral.inform_file_retracted" "(internal)" K.control
9010
ce78dc5e1a73 Toplevel.no_timing;
wenzelm
parents: 8990
diff changeset
   293
    (P.name >> (Toplevel.no_timing oo
ce78dc5e1a73 Toplevel.no_timing;
wenzelm
parents: 8990
diff changeset
   294
      (fn name => Toplevel.imperative (fn () => inform_file_retracted name))));
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   295
7954
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   296
fun init_outer_syntax () = OuterSyntax.add_parsers
8647
656f1b61875a added ProofGeneral.undo;
wenzelm
parents: 8495
diff changeset
   297
 [old_undoP, undoP, restartP, kill_proofP, context_thy_onlyP, try_context_thy_onlyP,
7954
ea6b79f32cfd added (try_)update_thy_only;
wenzelm
parents: 7939
diff changeset
   298
  inform_file_processedP, inform_file_retractedP];
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   299
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   300
end;
7193
cc7a89d233f7 proper ProofGeneral/isa setup;
wenzelm
parents: 7100
diff changeset
   301
cc7a89d233f7 proper ProofGeneral/isa setup;
wenzelm
parents: 7100
diff changeset
   302
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
   303
(* init *)
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
   304
12592
0eb1685a00b4 restart: sync_thy_loader instead of overly aggressive touch_all_thys;
wenzelm
parents: 12424
diff changeset
   305
val initialized = ref false;
0eb1685a00b4 restart: sync_thy_loader instead of overly aggressive touch_all_thys;
wenzelm
parents: 12424
diff changeset
   306
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
   307
fun init isar =
12592
0eb1685a00b4 restart: sync_thy_loader instead of overly aggressive touch_all_thys;
wenzelm
parents: 12424
diff changeset
   308
 (conditional (not (! initialized)) (fn () =>
0eb1685a00b4 restart: sync_thy_loader instead of overly aggressive touch_all_thys;
wenzelm
parents: 12424
diff changeset
   309
   (if isar then setmp warning_fn (K ()) init_outer_syntax () else ();
0eb1685a00b4 restart: sync_thy_loader instead of overly aggressive touch_all_thys;
wenzelm
parents: 12424
diff changeset
   310
    setup_xsymbols_output ();
0eb1685a00b4 restart: sync_thy_loader instead of overly aggressive touch_all_thys;
wenzelm
parents: 12424
diff changeset
   311
    setup_messages ();
0eb1685a00b4 restart: sync_thy_loader instead of overly aggressive touch_all_thys;
wenzelm
parents: 12424
diff changeset
   312
    setup_state ();
0eb1685a00b4 restart: sync_thy_loader instead of overly aggressive touch_all_thys;
wenzelm
parents: 12424
diff changeset
   313
    setup_thy_loader ();
0eb1685a00b4 restart: sync_thy_loader instead of overly aggressive touch_all_thys;
wenzelm
parents: 12424
diff changeset
   314
    set initialized; ()));
0eb1685a00b4 restart: sync_thy_loader instead of overly aggressive touch_all_thys;
wenzelm
parents: 12424
diff changeset
   315
  sync_thy_loader ();
0eb1685a00b4 restart: sync_thy_loader instead of overly aggressive touch_all_thys;
wenzelm
parents: 12424
diff changeset
   316
  print_mode := proof_generalN :: (! print_mode \ proof_generalN);
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
   317
  set quick_and_dirty;
9462
3ac87f80186d ThmDeps.enable;
wenzelm
parents: 9050
diff changeset
   318
  ThmDeps.enable ();
3ac87f80186d ThmDeps.enable;
wenzelm
parents: 9050
diff changeset
   319
  if isar then ml_prompts "ML> " "ML# "
3ac87f80186d ThmDeps.enable;
wenzelm
parents: 9050
diff changeset
   320
  else ml_prompts ("> " ^ oct_char "372") ("- " ^ oct_char "373");
12592
0eb1685a00b4 restart: sync_thy_loader instead of overly aggressive touch_all_thys;
wenzelm
parents: 12424
diff changeset
   321
  if isar then (welcome (); Isar.sync_main ()) else isa_restart ());
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
   322
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
   323
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   324
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   325
(** generate keyword classification file **)
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   326
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   327
local
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   328
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   329
val regexp_meta = explode ".*+?[]^$";
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   330
val regexp_quote = implode o map (fn c => if c mem regexp_meta then "\\\\" ^ c else c) o explode;
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   331
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   332
fun defconst name strs =
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   333
  "\n(defconst isar-keywords-" ^ name ^
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   334
  "\n  '(" ^ space_implode "\n    " (map (quote o regexp_quote) strs) ^ "))\n";
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   335
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   336
fun make_elisp_commands commands kind =
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   337
  defconst kind (mapfilter (fn (c, _, k, _) => if k = kind then Some c else None) commands);
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   338
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   339
fun make_elisp_syntax (keywords, commands) =
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   340
  ";;\n\
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   341
  \;; Keyword classification tables for Isabelle/Isar.\n\
11510
c6dd19025abe generated by Session.name;
wenzelm
parents: 11017
diff changeset
   342
  \;; This file was generated by " ^ Session.name () ^ " -- DO NOT EDIT!\n\
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   343
  \;;\n\
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   344
  \;; $" ^ "Id$\n\
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   345
  \;;\n" ^
8990
19956dd3809e write major keywords;
wenzelm
parents: 8886
diff changeset
   346
  defconst "major" (map #1 commands) ^
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   347
  defconst "minor" (filter Syntax.is_identifier keywords) ^
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   348
  implode (map (make_elisp_commands commands) OuterSyntax.Keyword.kinds) ^
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   349
  "\n(provide 'isar-keywords)\n";
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   350
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   351
in
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   352
12217
e3efc5c9f267 write_keywords: string argument (logic name);
wenzelm
parents: 11888
diff changeset
   353
fun write_keywords s =
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   354
  (init_outer_syntax ();
12217
e3efc5c9f267 write_keywords: string argument (logic name);
wenzelm
parents: 11888
diff changeset
   355
    File.write (Path.unpack ("isar-keywords" ^ (if s = "" then "" else "-" ^ s) ^".el"))
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   356
      (make_elisp_syntax (OuterSyntax.dest_keywords (), OuterSyntax.dest_parsers ())));
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   357
6699
1471f2bd74a0 Configuration for ProofGeneral of LFCS Edinburgh.
wenzelm
parents:
diff changeset
   358
end;
7937
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   359
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   360
82025fe607d3 added inform_file_processed, inform_file_retracted;
wenzelm
parents: 7922
diff changeset
   361
end;
10933
0b3997a180dd infix \\\\;
wenzelm
parents: 10417
diff changeset
   362
10954
a555bfb66c2d setup indent;
wenzelm
parents: 10933
diff changeset
   363
(*a hack for Proof General 3.2 to avoid problems with escapes in ML commands*)
10933
0b3997a180dd infix \\\\;
wenzelm
parents: 10417
diff changeset
   364
infix \\\\ val op \\\\ = op \\;