src/Pure/Syntax/ast.ML
author blanchet
Thu, 30 Jan 2014 15:01:40 +0100
changeset 55184 6e2295db4cf8
parent 52175 626a757d3c2d
child 56438 7f6b2634d853
permissions -rw-r--r--
keep formula right before skolemization, because the universal variables might be different (or differently ordered) as in the original axiom or negated conjecture from which it was skolemized
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
     1
(*  Title:      Pure/Syntax/ast.ML
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    Author:     Markus Wenzel, TU Muenchen
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     3
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
     4
Abstract syntax trees, translation rules, matching and normalization of asts.
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
42224
578a51fae383 discontinued special treatment of structure Ast: no pervasive content, no inclusion in structure Syntax;
wenzelm
parents: 42048
diff changeset
     7
signature AST =
16609
c787112bba1f removed obsolete (un)fold_ast2;
wenzelm
parents: 15973
diff changeset
     8
sig
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
  datatype ast =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
    Constant of string |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
    Variable of string |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
    Appl of ast list
42224
578a51fae383 discontinued special treatment of structure Ast: no pervasive content, no inclusion in structure Syntax;
wenzelm
parents: 42048
diff changeset
    13
  val mk_appl: ast -> ast list -> ast
258
e540b7d4ecb1 minor internal changes;
wenzelm
parents: 235
diff changeset
    14
  exception AST of string * ast list
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
    15
  val pretty_ast: ast -> Pretty.T
258
e540b7d4ecb1 minor internal changes;
wenzelm
parents: 235
diff changeset
    16
  val pretty_rule: ast * ast -> Pretty.T
42264
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents: 42224
diff changeset
    17
  val strip_positions: ast -> ast
42224
578a51fae383 discontinued special treatment of structure Ast: no pervasive content, no inclusion in structure Syntax;
wenzelm
parents: 42048
diff changeset
    18
  val head_of_rule: ast * ast -> string
578a51fae383 discontinued special treatment of structure Ast: no pervasive content, no inclusion in structure Syntax;
wenzelm
parents: 42048
diff changeset
    19
  val rule_error: ast * ast -> string option
10913
57eb8c1d6f88 export fold_ast etc.;
wenzelm
parents: 9372
diff changeset
    20
  val fold_ast: string -> ast list -> ast
57eb8c1d6f88 export fold_ast etc.;
wenzelm
parents: 9372
diff changeset
    21
  val fold_ast_p: string -> ast list * ast -> ast
57eb8c1d6f88 export fold_ast etc.;
wenzelm
parents: 9372
diff changeset
    22
  val unfold_ast: string -> ast -> ast list
57eb8c1d6f88 export fold_ast etc.;
wenzelm
parents: 9372
diff changeset
    23
  val unfold_ast_p: string -> ast -> ast list * ast
42277
7503beeffd8d tuned signature;
wenzelm
parents: 42264
diff changeset
    24
  val trace_raw: Config.raw
7503beeffd8d tuned signature;
wenzelm
parents: 42264
diff changeset
    25
  val trace: bool Config.T
43347
f18cf88453d6 tuned name (cf. blast_stats);
wenzelm
parents: 42277
diff changeset
    26
  val stats_raw: Config.raw
f18cf88453d6 tuned name (cf. blast_stats);
wenzelm
parents: 42277
diff changeset
    27
  val stats: bool Config.T
41377
390c53904220 configuration option "syntax_ast_trace" and "syntax_ast_stat";
wenzelm
parents: 38328
diff changeset
    28
  val normalize: Proof.context -> (string -> (ast * ast) list) -> ast -> ast
16609
c787112bba1f removed obsolete (un)fold_ast2;
wenzelm
parents: 15973
diff changeset
    29
end;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
42224
578a51fae383 discontinued special treatment of structure Ast: no pervasive content, no inclusion in structure Syntax;
wenzelm
parents: 42048
diff changeset
    31
structure Ast: AST =
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
struct
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
    34
(** abstract syntax trees **)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
(*asts come in two flavours:
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
    37
   - ordinary asts representing terms and typs: Variables are (often) treated
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
    38
     like Constants;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
   - patterns used as lhs and rhs in rules: Variables are placeholders for
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
     proper asts*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
datatype ast =
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
    43
  Constant of string |    (*"not", "_abs", "fun"*)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
    44
  Variable of string |    (*x, ?x, 'a, ?'a*)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
    45
  Appl of ast list;       (*(f x y z), ("fun" 'a 'b), ("_abs" x t)*)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
(*the list of subasts of an Appl node has to contain at least 2 elements, i.e.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
  there are no empty asts or nullary applications; use mk_appl for convenience*)
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
    49
fun mk_appl f [] = f
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
    50
  | mk_appl f args = Appl (f :: args);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
(*exception for system errors involving asts*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
exception AST of string * ast list;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
    57
(** print asts in a LISP-like style **)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
    58
14599
c3177fffd31a Replaced quote by Pretty.quote.
berghofe
parents: 12785
diff changeset
    59
fun pretty_ast (Constant a) = Pretty.quote (Pretty.str a)
42048
afd11ca8e018 support for encoded positions (for id_position, longid_position) as pseudo type-constraints -- still inactive;
wenzelm
parents: 41377
diff changeset
    60
  | pretty_ast (Variable x) =
42264
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents: 42224
diff changeset
    61
      (case Term_Position.decode x of
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents: 42224
diff changeset
    62
        SOME pos => Term_Position.pretty pos
42048
afd11ca8e018 support for encoded positions (for id_position, longid_position) as pseudo type-constraints -- still inactive;
wenzelm
parents: 41377
diff changeset
    63
      | NONE => Pretty.str x)
38328
36afb56ec49e tuned whitespace;
wenzelm
parents: 33957
diff changeset
    64
  | pretty_ast (Appl asts) = Pretty.enclose "(" ")" (Pretty.breaks (map pretty_ast asts));
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
    65
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
    66
fun pretty_rule (lhs, rhs) =
235
775dd81a58e5 cosmetic changes;
wenzelm
parents: 18
diff changeset
    67
  Pretty.block [pretty_ast lhs, Pretty.str "  ->", Pretty.brk 2, pretty_ast rhs];
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
    68
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
    69
42264
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents: 42224
diff changeset
    70
(* strip_positions *)
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents: 42224
diff changeset
    71
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents: 42224
diff changeset
    72
fun strip_positions (Appl ((t as Constant c) :: u :: (v as Variable x) :: asts)) =
52175
626a757d3c2d uniform Term_Position.markers (cf. dbadb4d03cbc);
wenzelm
parents: 43347
diff changeset
    73
      if member (op =) Term_Position.markers c andalso is_some (Term_Position.decode x)
42264
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents: 42224
diff changeset
    74
      then mk_appl (strip_positions u) (map strip_positions asts)
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents: 42224
diff changeset
    75
      else Appl (map strip_positions (t :: u :: v :: asts))
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents: 42224
diff changeset
    76
  | strip_positions (Appl asts) = Appl (map strip_positions asts)
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents: 42224
diff changeset
    77
  | strip_positions ast = ast;
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents: 42224
diff changeset
    78
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents: 42224
diff changeset
    79
b6c1b0c4c511 separate structure Term_Position;
wenzelm
parents: 42224
diff changeset
    80
(* head_of_ast and head_of_rule *)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    81
9372
7834e56e2277 AST translation rules no longer require constant head on LHS;
wenzelm
parents: 8997
diff changeset
    82
fun head_of_ast (Constant a) = a
7834e56e2277 AST translation rules no longer require constant head on LHS;
wenzelm
parents: 8997
diff changeset
    83
  | head_of_ast (Appl (Constant a :: _)) = a
7834e56e2277 AST translation rules no longer require constant head on LHS;
wenzelm
parents: 8997
diff changeset
    84
  | head_of_ast _ = "";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    85
9372
7834e56e2277 AST translation rules no longer require constant head on LHS;
wenzelm
parents: 8997
diff changeset
    86
fun head_of_rule (lhs, _) = head_of_ast lhs;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    87
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    89
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
    90
(** check translation rules **)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    91
32784
1a5dde5079ac eliminated redundant bindings;
wenzelm
parents: 32738
diff changeset
    92
fun rule_error (lhs, rhs) =
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
  let
19486
wenzelm
parents: 19473
diff changeset
    94
    fun add_vars (Constant _) = I
wenzelm
parents: 19473
diff changeset
    95
      | add_vars (Variable x) = cons x
wenzelm
parents: 19473
diff changeset
    96
      | add_vars (Appl asts) = fold add_vars asts;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
19486
wenzelm
parents: 19473
diff changeset
    98
    val lvars = add_vars lhs [];
wenzelm
parents: 19473
diff changeset
    99
    val rvars = add_vars rhs [];
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
  in
19486
wenzelm
parents: 19473
diff changeset
   101
    if has_duplicates (op =) lvars then SOME "duplicate vars in lhs"
33038
8f9594c31de4 dropped redundant gen_ prefix
haftmann
parents: 33037
diff changeset
   102
    else if not (subset (op =) (rvars, lvars)) then SOME "rhs contains extra variables"
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15421
diff changeset
   103
    else NONE
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   105
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   106
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   107
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
   108
(** ast translation utilities **)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   109
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   110
(* fold asts *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   111
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   112
fun fold_ast _ [] = raise Match
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   113
  | fold_ast _ [y] = y
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   114
  | fold_ast c (x :: xs) = Appl [Constant c, x, fold_ast c xs];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   115
19473
wenzelm
parents: 17412
diff changeset
   116
fun fold_ast_p c = uncurry (fold_rev (fn x => fn xs => Appl [Constant c, x, xs]));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   117
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   118
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   119
(* unfold asts *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   120
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   121
fun unfold_ast c (y as Appl [Constant c', x, xs]) =
16609
c787112bba1f removed obsolete (un)fold_ast2;
wenzelm
parents: 15973
diff changeset
   122
      if c = c' then x :: unfold_ast c xs else [y]
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   123
  | unfold_ast _ y = [y];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   124
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   125
fun unfold_ast_p c (y as Appl [Constant c', x, xs]) =
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
   126
      if c = c' then apfst (cons x) (unfold_ast_p c xs)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   127
      else ([], y)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   128
  | unfold_ast_p _ y = ([], y);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   129
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   130
16609
c787112bba1f removed obsolete (un)fold_ast2;
wenzelm
parents: 15973
diff changeset
   131
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   132
(** normalization of asts **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   133
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   134
(* match *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   135
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   136
fun match ast pat =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   137
  let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   138
    exception NO_MATCH;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   139
1127
42ec82147d83 changed macro expander such that patterns also match prefixes of appls;
wenzelm
parents: 922
diff changeset
   140
    fun mtch (Constant a) (Constant b) env =
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   141
          if a = b then env else raise NO_MATCH
1127
42ec82147d83 changed macro expander such that patterns also match prefixes of appls;
wenzelm
parents: 922
diff changeset
   142
      | mtch (Variable a) (Constant b) env =
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   143
          if a = b then env else raise NO_MATCH
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17221
diff changeset
   144
      | mtch ast (Variable x) env = Symtab.update (x, ast) env
1127
42ec82147d83 changed macro expander such that patterns also match prefixes of appls;
wenzelm
parents: 922
diff changeset
   145
      | mtch (Appl asts) (Appl pats) env = mtch_lst asts pats env
42ec82147d83 changed macro expander such that patterns also match prefixes of appls;
wenzelm
parents: 922
diff changeset
   146
      | mtch _ _ _ = raise NO_MATCH
42ec82147d83 changed macro expander such that patterns also match prefixes of appls;
wenzelm
parents: 922
diff changeset
   147
    and mtch_lst (ast :: asts) (pat :: pats) env =
42ec82147d83 changed macro expander such that patterns also match prefixes of appls;
wenzelm
parents: 922
diff changeset
   148
          mtch_lst asts pats (mtch ast pat env)
42ec82147d83 changed macro expander such that patterns also match prefixes of appls;
wenzelm
parents: 922
diff changeset
   149
      | mtch_lst [] [] env = env
42ec82147d83 changed macro expander such that patterns also match prefixes of appls;
wenzelm
parents: 922
diff changeset
   150
      | mtch_lst _ _ _ = raise NO_MATCH;
42ec82147d83 changed macro expander such that patterns also match prefixes of appls;
wenzelm
parents: 922
diff changeset
   151
42ec82147d83 changed macro expander such that patterns also match prefixes of appls;
wenzelm
parents: 922
diff changeset
   152
    val (head, args) =
42ec82147d83 changed macro expander such that patterns also match prefixes of appls;
wenzelm
parents: 922
diff changeset
   153
      (case (ast, pat) of
42ec82147d83 changed macro expander such that patterns also match prefixes of appls;
wenzelm
parents: 922
diff changeset
   154
        (Appl asts, Appl pats) =>
42ec82147d83 changed macro expander such that patterns also match prefixes of appls;
wenzelm
parents: 922
diff changeset
   155
          let val a = length asts and p = length pats in
33957
e9afca2118d4 normalized uncurry take/drop
haftmann
parents: 33955
diff changeset
   156
            if a > p then (Appl (take p asts), drop p asts)
1127
42ec82147d83 changed macro expander such that patterns also match prefixes of appls;
wenzelm
parents: 922
diff changeset
   157
            else (ast, [])
42ec82147d83 changed macro expander such that patterns also match prefixes of appls;
wenzelm
parents: 922
diff changeset
   158
          end
42ec82147d83 changed macro expander such that patterns also match prefixes of appls;
wenzelm
parents: 922
diff changeset
   159
      | _ => (ast, []));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   160
  in
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15421
diff changeset
   161
    SOME (mtch head pat Symtab.empty, args) handle NO_MATCH => NONE
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   162
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   163
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   164
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
   165
(* normalize *)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   166
42277
7503beeffd8d tuned signature;
wenzelm
parents: 42264
diff changeset
   167
val trace_raw = Config.declare "syntax_ast_trace" (fn _ => Config.Bool false);
7503beeffd8d tuned signature;
wenzelm
parents: 42264
diff changeset
   168
val trace = Config.bool trace_raw;
41377
390c53904220 configuration option "syntax_ast_trace" and "syntax_ast_stat";
wenzelm
parents: 38328
diff changeset
   169
43347
f18cf88453d6 tuned name (cf. blast_stats);
wenzelm
parents: 42277
diff changeset
   170
val stats_raw = Config.declare "syntax_ast_stats" (fn _ => Config.Bool false);
f18cf88453d6 tuned name (cf. blast_stats);
wenzelm
parents: 42277
diff changeset
   171
val stats = Config.bool stats_raw;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   172
42048
afd11ca8e018 support for encoded positions (for id_position, longid_position) as pseudo type-constraints -- still inactive;
wenzelm
parents: 41377
diff changeset
   173
fun message head body =
afd11ca8e018 support for encoded positions (for id_position, longid_position) as pseudo type-constraints -- still inactive;
wenzelm
parents: 41377
diff changeset
   174
  Pretty.string_of (Pretty.block [Pretty.str head, Pretty.brk 1, body]);
afd11ca8e018 support for encoded positions (for id_position, longid_position) as pseudo type-constraints -- still inactive;
wenzelm
parents: 41377
diff changeset
   175
41377
390c53904220 configuration option "syntax_ast_trace" and "syntax_ast_stat";
wenzelm
parents: 38328
diff changeset
   176
(*the normalizer works yoyo-like: top-down, bottom-up, top-down, ...*)
390c53904220 configuration option "syntax_ast_trace" and "syntax_ast_stat";
wenzelm
parents: 38328
diff changeset
   177
fun normalize ctxt get_rules pre_ast =
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   178
  let
42277
7503beeffd8d tuned signature;
wenzelm
parents: 42264
diff changeset
   179
    val trace = Config.get ctxt trace;
43347
f18cf88453d6 tuned name (cf. blast_stats);
wenzelm
parents: 42277
diff changeset
   180
    val stats = Config.get ctxt stats;
41377
390c53904220 configuration option "syntax_ast_trace" and "syntax_ast_stat";
wenzelm
parents: 38328
diff changeset
   181
32738
15bb09ca0378 explicit indication of Unsynchronized.ref;
wenzelm
parents: 30628
diff changeset
   182
    val passes = Unsynchronized.ref 0;
15bb09ca0378 explicit indication of Unsynchronized.ref;
wenzelm
parents: 30628
diff changeset
   183
    val failed_matches = Unsynchronized.ref 0;
15bb09ca0378 explicit indication of Unsynchronized.ref;
wenzelm
parents: 30628
diff changeset
   184
    val changes = Unsynchronized.ref 0;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   185
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
   186
    fun subst _ (ast as Constant _) = ast
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17221
diff changeset
   187
      | subst env (Variable x) = the (Symtab.lookup env x)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   188
      | subst env (Appl asts) = Appl (map (subst env) asts);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   189
11733
9dd88f3aa8e0 removed lookups count;
wenzelm
parents: 10913
diff changeset
   190
    fun try_rules ((lhs, rhs) :: pats) ast =
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   191
          (case match ast lhs of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15421
diff changeset
   192
            SOME (env, args) =>
32738
15bb09ca0378 explicit indication of Unsynchronized.ref;
wenzelm
parents: 30628
diff changeset
   193
              (Unsynchronized.inc changes; SOME (mk_appl (subst env rhs) args))
15bb09ca0378 explicit indication of Unsynchronized.ref;
wenzelm
parents: 30628
diff changeset
   194
          | NONE => (Unsynchronized.inc failed_matches; try_rules pats ast))
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15421
diff changeset
   195
      | try_rules [] _ = NONE;
11733
9dd88f3aa8e0 removed lookups count;
wenzelm
parents: 10913
diff changeset
   196
    val try_headless_rules = try_rules (get_rules "");
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   197
11733
9dd88f3aa8e0 removed lookups count;
wenzelm
parents: 10913
diff changeset
   198
    fun try ast a =
9dd88f3aa8e0 removed lookups count;
wenzelm
parents: 10913
diff changeset
   199
      (case try_rules (get_rules a) ast of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15421
diff changeset
   200
        NONE => try_headless_rules ast
11733
9dd88f3aa8e0 removed lookups count;
wenzelm
parents: 10913
diff changeset
   201
      | some => some);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   202
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   203
    fun rewrite (ast as Constant a) = try ast a
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   204
      | rewrite (ast as Variable a) = try ast a
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   205
      | rewrite (ast as Appl (Constant a :: _)) = try ast a
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   206
      | rewrite (ast as Appl (Variable a :: _)) = try ast a
11733
9dd88f3aa8e0 removed lookups count;
wenzelm
parents: 10913
diff changeset
   207
      | rewrite ast = try_headless_rules ast;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   208
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   209
    fun rewrote old_ast new_ast =
42048
afd11ca8e018 support for encoded positions (for id_position, longid_position) as pseudo type-constraints -- still inactive;
wenzelm
parents: 41377
diff changeset
   210
      if trace then tracing (message "rewrote:" (pretty_rule (old_ast, new_ast)))
21962
279b129498b6 removed conditional combinator;
wenzelm
parents: 19486
diff changeset
   211
      else ();
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   212
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   213
    fun norm_root ast =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   214
      (case rewrite ast of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15421
diff changeset
   215
        SOME new_ast => (rewrote ast new_ast; norm_root new_ast)
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15421
diff changeset
   216
      | NONE => ast);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   217
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   218
    fun norm ast =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   219
      (case norm_root ast of
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   220
        Appl sub_asts =>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   221
          let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   222
            val old_changes = ! changes;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   223
            val new_ast = Appl (map norm sub_asts);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   224
          in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   225
            if old_changes = ! changes then new_ast else norm_root new_ast
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   226
          end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   227
      | atomic_ast => atomic_ast);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   228
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   229
    fun normal ast =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   230
      let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   231
        val old_changes = ! changes;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   232
        val new_ast = norm ast;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   233
      in
32738
15bb09ca0378 explicit indication of Unsynchronized.ref;
wenzelm
parents: 30628
diff changeset
   234
        Unsynchronized.inc passes;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   235
        if old_changes = ! changes then new_ast else normal new_ast
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   236
      end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   237
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   238
42048
afd11ca8e018 support for encoded positions (for id_position, longid_position) as pseudo type-constraints -- still inactive;
wenzelm
parents: 41377
diff changeset
   239
    val _ = if trace then tracing (message "pre:" (pretty_ast pre_ast)) else ();
9372
7834e56e2277 AST translation rules no longer require constant head on LHS;
wenzelm
parents: 8997
diff changeset
   240
    val post_ast = normal pre_ast;
21962
279b129498b6 removed conditional combinator;
wenzelm
parents: 19486
diff changeset
   241
    val _ =
43347
f18cf88453d6 tuned name (cf. blast_stats);
wenzelm
parents: 42277
diff changeset
   242
      if trace orelse stats then
42048
afd11ca8e018 support for encoded positions (for id_position, longid_position) as pseudo type-constraints -- still inactive;
wenzelm
parents: 41377
diff changeset
   243
        tracing (message "post:" (pretty_ast post_ast) ^ "\nnormalize: " ^
21962
279b129498b6 removed conditional combinator;
wenzelm
parents: 19486
diff changeset
   244
          string_of_int (! passes) ^ " passes, " ^
279b129498b6 removed conditional combinator;
wenzelm
parents: 19486
diff changeset
   245
          string_of_int (! changes) ^ " changes, " ^
279b129498b6 removed conditional combinator;
wenzelm
parents: 19486
diff changeset
   246
          string_of_int (! failed_matches) ^ " matches failed")
279b129498b6 removed conditional combinator;
wenzelm
parents: 19486
diff changeset
   247
      else ();
279b129498b6 removed conditional combinator;
wenzelm
parents: 19486
diff changeset
   248
  in post_ast end;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   249
1506
192c48376d25 Elimination of fully-functorial style.
paulson
parents: 1127
diff changeset
   250
end;