src/Tools/Metis/metis.ML
author wenzelm
Mon, 13 Apr 2020 22:08:14 +0200
changeset 71751 abf3e80bd815
parent 59179 cad8a0012a12
child 72004 913162a47d9f
permissions -rw-r--r--
tuned NEWS;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
     1
(*
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
     2
   This file was generated by the "make_metis" script. The BSD License is used
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
     3
   with Joe Hurd's kind permission. Extract from a September 13, 2010 email
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
     4
   written by Joe Hurd:
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
     5
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
     6
       I hereby give permission to the Isabelle team to release Metis as part
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
     7
       of Isabelle, with the Metis code covered under the Isabelle BSD
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
     8
       license.
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
     9
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    10
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
    11
(******************************************************************)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
    12
(* GENERATED FILE -- DO NOT EDIT -- GENERATED FILE -- DO NOT EDIT *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
    13
(* GENERATED FILE -- DO NOT EDIT -- GENERATED FILE -- DO NOT EDIT *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
    14
(* GENERATED FILE -- DO NOT EDIT -- GENERATED FILE -- DO NOT EDIT *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
    15
(******************************************************************)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
    16
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
    17
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
    18
(**** Original file: src/Random.sig ****)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    19
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    20
(*  Title:      Tools/random_word.ML
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    21
    Author:     Makarius
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    22
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    23
Simple generator for pseudo-random numbers, using unboxed word
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    24
arithmetic only.  Unprotected concurrency introduces some true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    25
randomness.
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    26
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    27
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
    28
signature Metis_Random =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    29
sig
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
    30
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    31
  val nextWord : unit -> word
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    32
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    33
  val nextBool : unit -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    34
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    35
  val nextInt : int -> int  (* k -> [0,k) *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    36
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    37
  val nextReal : unit -> real  (* () -> [0,1) *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    38
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    39
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    40
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
    41
(**** Original file: src/Random.sml ****)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    42
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    43
(*  Title:      Tools/random_word.ML
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    44
    Author:     Makarius
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    45
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    46
Simple generator for pseudo-random numbers, using unboxed word
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    47
arithmetic only.  Unprotected concurrency introduces some true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    48
randomness.
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    49
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    50
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
    51
structure Metis_Random :> Metis_Random =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    52
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    53
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    54
(* random words: 0w0 <= result <= max_word *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    55
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    56
(*minimum length of unboxed words on all supported ML platforms*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    57
val _ = Word.wordSize >= 30
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    58
  orelse raise Fail ("Bad platform word size");
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    59
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    60
val max_word = 0wx3FFFFFFF;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    61
val top_bit = 0wx20000000;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    62
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    63
(*multiplier according to Borosh and Niederreiter (for modulus = 2^30),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    64
  see http://random.mat.sbg.ac.at/~charly/server/server.html*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    65
val a = 0w777138309;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    66
fun step x = Word.andb (a * x + 0w1, max_word);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    67
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    68
fun change r f = r := f (!r);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    69
local val rand = (*Unsynchronized.*)Unsynchronized.ref 0w1
39428
b42d9885c129 regenerated "metis.ML"
blanchet
parents: 39417
diff changeset
    70
in fun nextWord () = ((*Unsynchronized.*)change rand step; ! rand) end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    71
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    72
(*NB: higher bits are more random than lower ones*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    73
fun nextBool () = Word.andb (nextWord (), top_bit) = 0w0;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    74
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    75
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    76
(* random integers: 0 <= result < k *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    77
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    78
val max_int = Word.toInt max_word;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    79
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    80
fun nextInt k =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    81
  if k <= 0 orelse k > max_int then raise Fail ("next_int: out of range")
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    82
  else if k = max_int then Word.toInt (nextWord ())
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    83
  else Word.toInt (Word.mod (nextWord (), Word.fromInt k));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    84
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    85
(* random reals: 0.0 <= result < 1.0 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    86
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    87
val scaling = real max_int + 1.0;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    88
fun nextReal () = real (Word.toInt (nextWord ())) / scaling;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    89
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    90
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
    91
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
    92
(**** Original file: src/Portable.sig ****)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
    93
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
    94
(* ========================================================================= *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
    95
(* ML COMPILER SPECIFIC FUNCTIONS                                            *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
    96
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
    97
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
    98
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
    99
signature Metis_Portable =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   100
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   101
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   102
(* ------------------------------------------------------------------------- *)
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   103
(* The ML implementation.                                                    *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   104
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   105
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   106
val ml : string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   107
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   108
(* ------------------------------------------------------------------------- *)
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   109
(* Pointer equality using the run-time system.                               *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   110
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   111
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   112
val pointerEqual : 'a * 'a -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   113
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   114
(* ------------------------------------------------------------------------- *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   115
(* Marking critical sections of code.                                        *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   116
(* ------------------------------------------------------------------------- *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   117
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   118
val critical : (unit -> 'a) -> unit -> 'a
39429
126b879df319 move "CRITICAL" to "PortableXxx", where it belongs and used to be;
blanchet
parents: 39428
diff changeset
   119
126b879df319 move "CRITICAL" to "PortableXxx", where it belongs and used to be;
blanchet
parents: 39428
diff changeset
   120
(* ------------------------------------------------------------------------- *)
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   121
(* Generating random values.                                                 *)
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   122
(* ------------------------------------------------------------------------- *)
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   123
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   124
val randomBool : unit -> bool
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   125
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   126
val randomInt : int -> int  (* n |-> [0,n) *)
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   127
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   128
val randomReal : unit -> real  (* () |-> [0,1] *)
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   129
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
   130
val randomWord : unit -> Word.word
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   131
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   132
(* ------------------------------------------------------------------------- *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   133
(* Timing function applications.                                             *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   134
(* ------------------------------------------------------------------------- *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   135
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   136
val time : ('a -> 'b) -> 'a -> 'b
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   137
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   138
end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   139
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   140
(**** Original file: PortableIsabelle.sml ****)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   141
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   142
(*  Title:      Tools/Metis/PortableIsabelle.sml
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   143
    Author:     Jasmin Blanchette, TU Muenchen
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   144
    Copyright   2010
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   145
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   146
Isabelle-specific setup for Metis. Based on "src/PortablePolyml.sml".
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   147
*)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   148
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
   149
structure Metis_Portable :> Metis_Portable =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   150
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   151
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   152
val ml = "isabelle"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   153
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   154
fun pointerEqual (x : 'a, y : 'a) = pointer_eq (x, y)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   155
59179
cad8a0012a12 more elementary Multithreading.synchronized;
wenzelm
parents: 56281
diff changeset
   156
local
cad8a0012a12 more elementary Multithreading.synchronized;
wenzelm
parents: 56281
diff changeset
   157
  val lock = Mutex.mutex ();
cad8a0012a12 more elementary Multithreading.synchronized;
wenzelm
parents: 56281
diff changeset
   158
in
cad8a0012a12 more elementary Multithreading.synchronized;
wenzelm
parents: 56281
diff changeset
   159
  fun critical e () = Multithreading.synchronized "metis" lock e
cad8a0012a12 more elementary Multithreading.synchronized;
wenzelm
parents: 56281
diff changeset
   160
end;
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   161
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   162
val randomWord = Metis_Random.nextWord
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   163
val randomBool = Metis_Random.nextBool
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   164
val randomInt = Metis_Random.nextInt
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   165
val randomReal = Metis_Random.nextReal
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   166
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   167
fun time f x = f x (* dummy *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   168
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   169
end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   170
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   171
datatype 'a frag = QUOTE of string | ANTIQUOTE of 'a
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   172
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   173
(**** Original file: src/Useful.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   174
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   175
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   176
(* ML UTILITY FUNCTIONS                                                      *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   177
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   178
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   179
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
   180
signature Metis_Useful =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   181
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   182
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   183
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   184
(* Exceptions.                                                               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   185
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   186
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   187
exception Error of string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   188
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   189
exception Bug of string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   190
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   191
val total : ('a -> 'b) -> 'a -> 'b option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   192
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   193
val can : ('a -> 'b) -> 'a -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   194
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   195
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   196
(* Tracing.                                                                  *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   197
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   198
32740
9dd0a2f83429 explicit indication of Unsynchronized.ref;
wenzelm
parents: 30161
diff changeset
   199
val tracePrint : (string -> unit) Unsynchronized.ref
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   200
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   201
val trace : string -> unit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   202
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   203
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   204
(* Combinators.                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   205
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   206
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   207
val C : ('a -> 'b -> 'c) -> 'b -> 'a -> 'c
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   208
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   209
val I : 'a -> 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   210
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   211
val K : 'a -> 'b -> 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   212
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   213
val S : ('a -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'c
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   214
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   215
val W : ('a -> 'a -> 'b) -> 'a -> 'b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   216
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   217
val funpow : int -> ('a -> 'a) -> 'a -> 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   218
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   219
val exp : ('a * 'a -> 'a) -> 'a -> int -> 'a -> 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   220
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   221
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   222
(* Pairs.                                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   223
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   224
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   225
val fst : 'a * 'b -> 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   226
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   227
val snd : 'a * 'b -> 'b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   228
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   229
val pair : 'a -> 'b -> 'a * 'b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   230
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   231
val swap : 'a * 'b -> 'b * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   232
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   233
val curry : ('a * 'b -> 'c) -> 'a -> 'b -> 'c
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   234
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   235
val uncurry : ('a -> 'b -> 'c) -> 'a * 'b -> 'c
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   236
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   237
val ## : ('a -> 'c) * ('b -> 'd) -> 'a * 'b -> 'c * 'd
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   238
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   239
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   240
(* State transformers.                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   241
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   242
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   243
val unit : 'a -> 's -> 'a * 's
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   244
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   245
val bind : ('s -> 'a * 's) -> ('a -> 's -> 'b * 's) -> 's -> 'b * 's
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   246
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   247
val mmap : ('a -> 'b) -> ('s -> 'a * 's) -> 's -> 'b * 's
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   248
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   249
val mjoin : ('s -> ('s -> 'a * 's) * 's) -> 's -> 'a * 's
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   250
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   251
val mwhile : ('a -> bool) -> ('a -> 's -> 'a * 's) -> 'a -> 's -> 'a * 's
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   252
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   253
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   254
(* Equality.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   255
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   256
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   257
val equal : ''a -> ''a -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   258
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   259
val notEqual : ''a -> ''a -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   260
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   261
val listEqual : ('a -> 'a -> bool) -> 'a list -> 'a list -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   262
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   263
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   264
(* Comparisons.                                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   265
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   266
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   267
val mapCompare : ('a -> 'b) -> ('b * 'b -> order) -> 'a * 'a -> order
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   268
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   269
val revCompare : ('a * 'a -> order) -> 'a * 'a -> order
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   270
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   271
val prodCompare :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   272
    ('a * 'a -> order) -> ('b * 'b -> order) -> ('a * 'b) * ('a * 'b) -> order
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   273
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   274
val lexCompare : ('a * 'a -> order) -> 'a list * 'a list -> order
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   275
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   276
val optionCompare : ('a * 'a -> order) -> 'a option * 'a option -> order
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   277
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   278
val boolCompare : bool * bool -> order  (* false < true *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   279
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   280
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   281
(* Lists: note we count elements from 0.                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   282
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   283
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   284
val cons : 'a -> 'a list -> 'a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   285
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   286
val hdTl : 'a list -> 'a * 'a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   287
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   288
val append : 'a list -> 'a list -> 'a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   289
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   290
val singleton : 'a -> 'a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   291
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   292
val first : ('a -> 'b option) -> 'a list -> 'b option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   293
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   294
val maps : ('a -> 's -> 'b * 's) -> 'a list -> 's -> 'b list * 's
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   295
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   296
val mapsPartial : ('a -> 's -> 'b option * 's) -> 'a list -> 's -> 'b list * 's
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   297
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   298
val zipWith : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   299
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   300
val zip : 'a list -> 'b list -> ('a * 'b) list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   301
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   302
val unzip : ('a * 'b) list -> 'a list * 'b list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   303
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   304
val cartwith : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   305
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   306
val cart : 'a list -> 'b list -> ('a * 'b) list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   307
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   308
val takeWhile : ('a -> bool) -> 'a list -> 'a list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   309
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   310
val dropWhile : ('a -> bool) -> 'a list -> 'a list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   311
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   312
val divideWhile : ('a -> bool) -> 'a list -> 'a list * 'a list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   313
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   314
val groups : ('a * 's -> bool * 's) -> 's -> 'a list -> 'a list list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   315
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   316
val groupsBy : ('a * 'a -> bool) -> 'a list -> 'a list list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   317
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   318
val groupsByFst : (''a * 'b) list -> (''a * 'b list) list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   319
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   320
val groupsOf : int -> 'a list -> 'a list list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   321
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   322
val index : ('a -> bool) -> 'a list -> int option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   323
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   324
val enumerate : 'a list -> (int * 'a) list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   325
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   326
val divide : 'a list -> int -> 'a list * 'a list  (* Subscript *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   327
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   328
val revDivide : 'a list -> int -> 'a list * 'a list  (* Subscript *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   329
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   330
val updateNth : int * 'a -> 'a list -> 'a list  (* Subscript *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   331
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   332
val deleteNth : int -> 'a list -> 'a list  (* Subscript *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   333
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   334
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   335
(* Sets implemented with lists.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   336
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   337
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   338
val mem : ''a -> ''a list -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   339
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   340
val insert : ''a -> ''a list -> ''a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   341
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   342
val delete : ''a -> ''a list -> ''a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   343
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   344
val setify : ''a list -> ''a list  (* removes duplicates *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   345
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   346
val union : ''a list -> ''a list -> ''a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   347
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   348
val intersect : ''a list -> ''a list -> ''a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   349
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   350
val difference : ''a list -> ''a list -> ''a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   351
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   352
val subset : ''a list -> ''a list -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   353
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   354
val distinct : ''a list -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   355
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   356
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   357
(* Sorting and searching.                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   358
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   359
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   360
val minimum : ('a * 'a -> order) -> 'a list -> 'a * 'a list  (* Empty *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   361
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   362
val maximum : ('a * 'a -> order) -> 'a list -> 'a * 'a list  (* Empty *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   363
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   364
val merge : ('a * 'a -> order) -> 'a list -> 'a list -> 'a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   365
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   366
val sort : ('a * 'a -> order) -> 'a list -> 'a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   367
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   368
val sortMap : ('a -> 'b) -> ('b * 'b -> order) -> 'a list -> 'a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   369
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   370
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   371
(* Integers.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   372
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   373
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   374
val interval : int -> int -> int list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   375
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   376
val divides : int -> int -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   377
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   378
val gcd : int -> int -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   379
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   380
val primes : int -> int list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   381
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   382
val primesUpTo : int -> int list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   383
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   384
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   385
(* Strings.                                                                  *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   386
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   387
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   388
val rot : int -> char -> char
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   389
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   390
val charToInt : char -> int option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   391
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   392
val charFromInt : int -> char option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   393
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   394
val nChars : char -> int -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   395
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   396
val chomp : string -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   397
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   398
val trim : string -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   399
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   400
val join : string -> string list -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   401
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   402
val split : string -> string -> string list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   403
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   404
val capitalize : string -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   405
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   406
val mkPrefix : string -> string -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   407
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   408
val destPrefix : string -> string -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   409
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   410
val isPrefix : string -> string -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   411
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   412
val stripPrefix : (char -> bool) -> string -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   413
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   414
val mkSuffix : string -> string -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   415
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   416
val destSuffix : string -> string -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   417
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   418
val isSuffix : string -> string -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   419
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   420
val stripSuffix : (char -> bool) -> string -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   421
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   422
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   423
(* Tables.                                                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   424
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   425
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   426
type columnAlignment = {leftAlign : bool, padChar : char}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   427
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   428
val alignColumn : columnAlignment -> string list -> string list -> string list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   429
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   430
val alignTable : columnAlignment list -> string list list -> string list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   431
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   432
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   433
(* Reals.                                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   434
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   435
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   436
val percentToString : real -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   437
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   438
val pos : real -> real
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   439
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   440
val log2 : real -> real  (* Domain *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   441
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   442
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   443
(* Sum datatype.                                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   444
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   445
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   446
datatype ('a,'b) sum = Left of 'a | Right of 'b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   447
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   448
val destLeft : ('a,'b) sum -> 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   449
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   450
val isLeft : ('a,'b) sum -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   451
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   452
val destRight : ('a,'b) sum -> 'b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   453
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   454
val isRight : ('a,'b) sum -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   455
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   456
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
   457
(* Metis_Useful impure features.                                                   *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   458
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   459
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   460
val newInt : unit -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   461
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   462
val newInts : int -> int list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   463
32740
9dd0a2f83429 explicit indication of Unsynchronized.ref;
wenzelm
parents: 30161
diff changeset
   464
val withRef : 'r Unsynchronized.ref * 'r -> ('a -> 'b) -> 'a -> 'b
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   465
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
   466
val cloneArray : 'a Array.array -> 'a Array.array
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   467
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   468
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   469
(* The environment.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   470
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   471
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   472
val host : unit -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   473
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   474
val time : unit -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   475
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   476
val date : unit -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   477
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   478
val readDirectory : {directory : string} -> {filename : string} list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   479
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   480
val readTextFile : {filename : string} -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   481
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   482
val writeTextFile : {contents : string, filename : string} -> unit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   483
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   484
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   485
(* Profiling and error reporting.                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   486
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   487
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   488
val try : ('a -> 'b) -> 'a -> 'b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   489
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   490
val chat : string -> unit  (* stdout *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   491
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   492
val chide : string -> unit  (* stderr *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   493
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   494
val warn : string -> unit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   495
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   496
val die : string -> 'exit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   497
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   498
val timed : ('a -> 'b) -> 'a -> real * 'b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   499
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   500
val timedMany : ('a -> 'b) -> 'a -> real * 'b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   501
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   502
val executionTime : unit -> real  (* Wall clock execution time *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   503
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   504
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   505
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   506
(**** Original file: src/Useful.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   507
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   508
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   509
(* ML UTILITY FUNCTIONS                                                      *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   510
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   511
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   512
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
   513
structure Metis_Useful :> Metis_Useful =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   514
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   515
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   516
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   517
(* Exceptions.                                                               *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   518
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   519
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   520
exception Error of string;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   521
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   522
exception Bug of string;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   523
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   524
fun errorToStringOption err =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   525
    case err of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   526
      Error message => SOME ("Error: " ^ message)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   527
    | _ => NONE;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   528
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   529
(*mlton
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   530
val () = MLton.Exn.addExnMessager errorToStringOption;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   531
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   532
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   533
fun errorToString err =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   534
    case errorToStringOption err of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   535
      SOME s => "\n" ^ s ^ "\n"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   536
    | NONE => raise Bug "errorToString: not an Error exception";
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   537
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   538
fun bugToStringOption err =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   539
    case err of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   540
      Bug message => SOME ("Bug: " ^ message)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   541
    | _ => NONE;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   542
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   543
(*mlton
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   544
val () = MLton.Exn.addExnMessager bugToStringOption;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   545
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   546
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   547
fun bugToString err =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   548
    case bugToStringOption err of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   549
      SOME s => "\n" ^ s ^ "\n"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   550
    | NONE => raise Bug "bugToString: not a Bug exception";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   551
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   552
fun total f x = SOME (f x) handle Error _ => NONE;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   553
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   554
fun can f = Option.isSome o total f;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   555
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   556
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   557
(* Tracing.                                                                  *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   558
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   559
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   560
local
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   561
  val traceOut = TextIO.stdOut;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   562
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   563
  fun tracePrintFn mesg =
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   564
      let
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   565
        val () = TextIO.output (traceOut,mesg)
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   566
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   567
        val () = TextIO.flushOut traceOut
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   568
      in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   569
        ()
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   570
      end;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   571
in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   572
  val tracePrint = Unsynchronized.ref tracePrintFn;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   573
end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   574
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   575
fun trace mesg = !tracePrint mesg;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   576
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   577
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   578
(* Combinators.                                                              *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   579
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   580
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   581
fun C f x y = f y x;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   582
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   583
fun I x = x;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   584
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   585
fun K x y = x;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   586
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   587
fun S f g x = f x (g x);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   588
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   589
fun W f x = f x x;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   590
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   591
fun funpow 0 _ x = x
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   592
  | funpow n f x = funpow (n - 1) f (f x);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   593
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   594
fun exp m =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   595
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   596
      fun f _ 0 z = z
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   597
        | f x y z = f (m (x,x)) (y div 2) (if y mod 2 = 0 then z else m (z,x))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   598
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   599
      f
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   600
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   601
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   602
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   603
(* Pairs.                                                                    *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   604
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   605
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   606
fun fst (x,_) = x;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   607
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   608
fun snd (_,y) = y;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   609
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   610
fun pair x y = (x,y);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   611
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   612
fun swap (x,y) = (y,x);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   613
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   614
fun curry f x y = f (x,y);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   615
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   616
fun uncurry f (x,y) = f x y;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   617
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   618
val op## = fn (f,g) => fn (x,y) => (f x, g y);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   619
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   620
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   621
(* State transformers.                                                       *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   622
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   623
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   624
val unit : 'a -> 's -> 'a * 's = pair;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   625
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   626
fun bind f (g : 'a -> 's -> 'b * 's) = uncurry g o f;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   627
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   628
fun mmap f (m : 's -> 'a * 's) = bind m (unit o f);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   629
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   630
fun mjoin (f : 's -> ('s -> 'a * 's) * 's) = bind f I;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   631
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   632
fun mwhile c b = let fun f a = if c a then bind (b a) f else unit a in f end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   633
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   634
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   635
(* Equality.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   636
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   637
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   638
val equal = fn x => fn y => x = y;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   639
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   640
val notEqual = fn x => fn y => x <> y;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   641
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   642
fun listEqual xEq =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   643
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   644
      fun xsEq [] [] = true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   645
        | xsEq (x1 :: xs1) (x2 :: xs2) = xEq x1 x2 andalso xsEq xs1 xs2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   646
        | xsEq _ _ = false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   647
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   648
      xsEq
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   649
    end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   650
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   651
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   652
(* Comparisons.                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   653
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   654
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   655
fun mapCompare f cmp (a,b) = cmp (f a, f b);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   656
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   657
fun revCompare cmp x_y =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   658
    case cmp x_y of LESS => GREATER | EQUAL => EQUAL | GREATER => LESS;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   659
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   660
fun prodCompare xCmp yCmp ((x1,y1),(x2,y2)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   661
    case xCmp (x1,x2) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   662
      LESS => LESS
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   663
    | EQUAL => yCmp (y1,y2)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   664
    | GREATER => GREATER;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   665
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   666
fun lexCompare cmp =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   667
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   668
      fun lex ([],[]) = EQUAL
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   669
        | lex ([], _ :: _) = LESS
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   670
        | lex (_ :: _, []) = GREATER
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   671
        | lex (x :: xs, y :: ys) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   672
          case cmp (x,y) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   673
            LESS => LESS
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   674
          | EQUAL => lex (xs,ys)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   675
          | GREATER => GREATER
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   676
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   677
      lex
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   678
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   679
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   680
fun optionCompare _ (NONE,NONE) = EQUAL
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   681
  | optionCompare _ (NONE,_) = LESS
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   682
  | optionCompare _ (_,NONE) = GREATER
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   683
  | optionCompare cmp (SOME x, SOME y) = cmp (x,y);
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   684
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   685
fun boolCompare (false,true) = LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   686
  | boolCompare (true,false) = GREATER
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   687
  | boolCompare _ = EQUAL;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   688
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   689
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   690
(* Lists.                                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   691
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   692
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   693
fun cons x y = x :: y;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   694
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   695
fun hdTl l = (hd l, tl l);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   696
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   697
fun append xs ys = xs @ ys;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   698
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   699
fun singleton a = [a];
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   700
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   701
fun first f [] = NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   702
  | first f (x :: xs) = (case f x of NONE => first f xs | s => s);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   703
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   704
fun maps (_ : 'a -> 's -> 'b * 's) [] = unit []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   705
  | maps f (x :: xs) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   706
    bind (f x) (fn y => bind (maps f xs) (fn ys => unit (y :: ys)));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   707
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   708
fun mapsPartial (_ : 'a -> 's -> 'b option * 's) [] = unit []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   709
  | mapsPartial f (x :: xs) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   710
    bind
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   711
      (f x)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   712
      (fn yo =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   713
          bind
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   714
            (mapsPartial f xs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   715
            (fn ys => unit (case yo of NONE => ys | SOME y => y :: ys)));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   716
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   717
fun zipWith f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   718
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   719
      fun z l [] [] = l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   720
        | z l (x :: xs) (y :: ys) = z (f x y :: l) xs ys
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   721
        | z _ _ _ = raise Error "zipWith: lists different lengths";
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   722
    in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   723
      fn xs => fn ys => List.rev (z [] xs ys)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   724
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   725
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   726
fun zip xs ys = zipWith pair xs ys;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   727
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   728
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   729
  fun inc ((x,y),(xs,ys)) = (x :: xs, y :: ys);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   730
in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   731
  fun unzip ab = List.foldl inc ([],[]) (List.rev ab);
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   732
end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   733
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   734
fun cartwith f =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   735
    let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   736
      fun aux _ res _ [] = res
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   737
        | aux xsCopy res [] (y :: yt) = aux xsCopy res xsCopy yt
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   738
        | aux xsCopy res (x :: xt) (ys as y :: _) =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   739
          aux xsCopy (f x y :: res) xt ys
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   740
    in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   741
      fn xs => fn ys =>
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   742
         let val xs' = List.rev xs in aux xs' [] xs' (List.rev ys) end
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   743
    end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   744
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   745
fun cart xs ys = cartwith pair xs ys;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   746
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   747
fun takeWhile p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   748
    let
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   749
      fun f acc [] = List.rev acc
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   750
        | f acc (x :: xs) = if p x then f (x :: acc) xs else List.rev acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   751
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   752
      f []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   753
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   754
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   755
fun dropWhile p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   756
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   757
      fun f [] = []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   758
        | f (l as x :: xs) = if p x then f xs else l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   759
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   760
      f
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   761
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   762
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   763
fun divideWhile p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   764
    let
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   765
      fun f acc [] = (List.rev acc, [])
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   766
        | f acc (l as x :: xs) = if p x then f (x :: acc) xs else (List.rev acc, l)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   767
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   768
      f []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   769
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   770
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   771
fun groups f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   772
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   773
      fun group acc row x l =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   774
          case l of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   775
            [] =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   776
            let
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   777
              val acc = if List.null row then acc else List.rev row :: acc
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   778
            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   779
              List.rev acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   780
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   781
          | h :: t =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   782
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   783
              val (eor,x) = f (h,x)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   784
            in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   785
              if eor then group (List.rev row :: acc) [h] x t
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   786
              else group acc (h :: row) x t
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   787
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   788
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   789
      group [] []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   790
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   791
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   792
fun groupsBy eq =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   793
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   794
      fun f (x_y as (x,_)) = (not (eq x_y), x)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   795
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   796
      fn [] => []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   797
       | h :: t =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   798
         case groups f h t of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   799
           [] => [[h]]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   800
         | hs :: ts => (h :: hs) :: ts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   801
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   802
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   803
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   804
  fun fstEq ((x,_),(y,_)) = x = y;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   805
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   806
  fun collapse l = (fst (hd l), List.map snd l);
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   807
in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   808
  fun groupsByFst l = List.map collapse (groupsBy fstEq l);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   809
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   810
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   811
fun groupsOf n =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   812
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   813
      fun f (_,i) = if i = 1 then (true,n) else (false, i - 1)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   814
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   815
      groups f (n + 1)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   816
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   817
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   818
fun index p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   819
  let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   820
    fun idx _ [] = NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   821
      | idx n (x :: xs) = if p x then SOME n else idx (n + 1) xs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   822
  in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   823
    idx 0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   824
  end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   825
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   826
fun enumerate l = fst (maps (fn x => fn m => ((m, x), m + 1)) l 0);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   827
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   828
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   829
  fun revDiv acc l 0 = (acc,l)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   830
    | revDiv _ [] _ = raise Subscript
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   831
    | revDiv acc (h :: t) n = revDiv (h :: acc) t (n - 1);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   832
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   833
  fun revDivide l = revDiv [] l;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   834
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   835
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   836
fun divide l n = let val (a,b) = revDivide l n in (List.rev a, b) end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   837
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   838
fun updateNth (n,x) l =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   839
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   840
      val (a,b) = revDivide l n
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   841
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   842
      case b of [] => raise Subscript | _ :: t => List.revAppend (a, x :: t)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   843
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   844
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   845
fun deleteNth n l =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   846
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   847
      val (a,b) = revDivide l n
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   848
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   849
      case b of [] => raise Subscript | _ :: t => List.revAppend (a,t)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   850
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   851
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   852
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   853
(* Sets implemented with lists.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   854
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   855
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   856
fun mem x = List.exists (equal x);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   857
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   858
fun insert x s = if mem x s then s else x :: s;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   859
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   860
fun delete x s = List.filter (not o equal x) s;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   861
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   862
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   863
  fun inc (v,x) = if mem v x then x else v :: x;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   864
in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   865
  fun setify s = List.rev (List.foldl inc [] s);
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   866
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   867
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   868
fun union s t =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   869
    let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   870
      fun inc (v,x) = if mem v t then x else v :: x
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   871
    in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   872
      List.foldl inc t (List.rev s)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   873
    end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   874
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   875
fun intersect s t =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   876
    let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   877
      fun inc (v,x) = if mem v t then v :: x else x
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   878
    in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   879
      List.foldl inc [] (List.rev s)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   880
    end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   881
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   882
fun difference s t =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   883
    let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   884
      fun inc (v,x) = if mem v t then x else v :: x
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   885
    in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   886
      List.foldl inc [] (List.rev s)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   887
    end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   888
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   889
fun subset s t = List.all (fn x => mem x t) s;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   890
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   891
fun distinct [] = true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   892
  | distinct (x :: rest) = not (mem x rest) andalso distinct rest;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   893
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   894
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   895
(* Sorting and searching.                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   896
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   897
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   898
(* Finding the minimum and maximum element of a list, wrt some order. *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   899
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   900
fun minimum cmp =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   901
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   902
      fun min (l,m,r) _ [] = (m, List.revAppend (l,r))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   903
        | min (best as (_,m,_)) l (x :: r) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   904
          min (case cmp (x,m) of LESS => (l,x,r) | _ => best) (x :: l) r
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   905
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   906
      fn [] => raise Empty
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   907
       | h :: t => min ([],h,t) [h] t
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   908
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   909
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   910
fun maximum cmp = minimum (revCompare cmp);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   911
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   912
(* Merge (for the following merge-sort, but generally useful too). *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   913
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   914
fun merge cmp =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   915
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   916
      fun mrg acc [] ys = List.revAppend (acc,ys)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   917
        | mrg acc xs [] = List.revAppend (acc,xs)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   918
        | mrg acc (xs as x :: xt) (ys as y :: yt) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   919
          (case cmp (x,y) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   920
             GREATER => mrg (y :: acc) xs yt
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   921
           | _ => mrg (x :: acc) xt ys)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   922
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   923
      mrg []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   924
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   925
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   926
(* Merge sort (stable). *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   927
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   928
fun sort cmp =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   929
    let
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   930
      fun findRuns acc r rs [] = List.rev (List.rev (r :: rs) :: acc)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   931
        | findRuns acc r rs (x :: xs) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   932
          case cmp (r,x) of
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   933
            GREATER => findRuns (List.rev (r :: rs) :: acc) x [] xs
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   934
          | _ => findRuns acc x (r :: rs) xs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   935
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   936
      fun mergeAdj acc [] = List.rev acc
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   937
        | mergeAdj acc (xs as [_]) = List.revAppend (acc,xs)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   938
        | mergeAdj acc (x :: y :: xs) = mergeAdj (merge cmp x y :: acc) xs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   939
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   940
      fun mergePairs [xs] = xs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   941
        | mergePairs l = mergePairs (mergeAdj [] l)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   942
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   943
      fn [] => []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   944
       | l as [_] => l
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   945
       | h :: t => mergePairs (findRuns [] h [] t)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   946
    end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   947
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   948
fun sortMap _ _ [] = []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   949
  | sortMap _ _ (l as [_]) = l
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   950
  | sortMap f cmp xs =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   951
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   952
      fun ncmp ((m,_),(n,_)) = cmp (m,n)
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   953
      val nxs = List.map (fn x => (f x, x)) xs
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   954
      val nys = sort ncmp nxs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   955
    in
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   956
      List.map snd nys
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   957
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   958
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   959
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   960
(* Integers.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   961
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   962
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   963
fun interval m 0 = []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   964
  | interval m len = m :: interval (m + 1) (len - 1);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   965
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   966
fun divides _ 0 = true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   967
  | divides 0 _ = false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   968
  | divides a b = b mod (Int.abs a) = 0;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   969
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   970
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   971
  fun hcf 0 n = n
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   972
    | hcf 1 _ = 1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   973
    | hcf m n = hcf (n mod m) m;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   974
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   975
  fun gcd m n =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   976
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   977
        val m = Int.abs m
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   978
        and n = Int.abs n
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   979
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   980
        if m < n then hcf m n else hcf n m
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   981
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   982
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   983
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   984
local
39503
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
   985
  fun calcPrimes mode ps i n =
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
   986
      if n = 0 then ps
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
   987
      else if List.exists (fn p => divides p i) ps then
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
   988
        let
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
   989
          val i = i + 1
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
   990
          and n = if mode then n else n - 1
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
   991
        in
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
   992
          calcPrimes mode ps i n
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
   993
        end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   994
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   995
        let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   996
          val ps = ps @ [i]
39503
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
   997
          and i = i + 1
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   998
          and n = n - 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   999
        in
39503
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1000
          calcPrimes mode ps i n
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1001
        end;
39503
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1002
in
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1003
  fun primes n =
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1004
      if n <= 0 then []
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1005
      else calcPrimes true [2] 3 (n - 1);
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1006
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1007
  fun primesUpTo n =
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1008
      if n < 2 then []
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1009
      else calcPrimes false [2] 3 (n - 2);
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1010
end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1011
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1012
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1013
(* Strings.                                                                  *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1014
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1015
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1016
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1017
  fun len l = (length l, l)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1018
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1019
  val upper = len (String.explode "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1020
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1021
  val lower = len (String.explode "abcdefghijklmnopqrstuvwxyz");
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1022
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1023
  fun rotate (n,l) c k =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1024
      List.nth (l, (k + Option.valOf (index (equal c) l)) mod n);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1025
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1026
  fun rot k c =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1027
      if Char.isLower c then rotate lower c k
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1028
      else if Char.isUpper c then rotate upper c k
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1029
      else c;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1030
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1031
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1032
fun charToInt #"0" = SOME 0
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1033
  | charToInt #"1" = SOME 1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1034
  | charToInt #"2" = SOME 2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1035
  | charToInt #"3" = SOME 3
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1036
  | charToInt #"4" = SOME 4
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1037
  | charToInt #"5" = SOME 5
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1038
  | charToInt #"6" = SOME 6
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1039
  | charToInt #"7" = SOME 7
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1040
  | charToInt #"8" = SOME 8
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1041
  | charToInt #"9" = SOME 9
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1042
  | charToInt _ = NONE;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1043
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1044
fun charFromInt 0 = SOME #"0"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1045
  | charFromInt 1 = SOME #"1"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1046
  | charFromInt 2 = SOME #"2"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1047
  | charFromInt 3 = SOME #"3"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1048
  | charFromInt 4 = SOME #"4"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1049
  | charFromInt 5 = SOME #"5"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1050
  | charFromInt 6 = SOME #"6"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1051
  | charFromInt 7 = SOME #"7"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1052
  | charFromInt 8 = SOME #"8"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1053
  | charFromInt 9 = SOME #"9"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1054
  | charFromInt _ = NONE;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1055
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1056
fun nChars x =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1057
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1058
      fun dup 0 l = l | dup n l = dup (n - 1) (x :: l)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1059
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1060
      fn n => String.implode (dup n [])
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1061
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1062
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1063
fun chomp s =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1064
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1065
      val n = size s
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1066
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1067
      if n = 0 orelse String.sub (s, n - 1) <> #"\n" then s
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1068
      else String.substring (s, 0, n - 1)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1069
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1070
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1071
local
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1072
  fun chop l =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1073
      case l of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1074
        [] => []
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1075
      | h :: t => if Char.isSpace h then chop t else l;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1076
in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  1077
  val trim = String.implode o chop o List.rev o chop o List.rev o String.explode;
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1078
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1079
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1080
val join = String.concatWith;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1081
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1082
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1083
  fun match [] l = SOME l
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1084
    | match _ [] = NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1085
    | match (x :: xs) (y :: ys) = if x = y then match xs ys else NONE;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1086
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1087
  fun stringify acc [] = acc
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1088
    | stringify acc (h :: t) = stringify (String.implode h :: acc) t;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1089
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1090
  fun split sep =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1091
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1092
        val pat = String.explode sep
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1093
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  1094
        fun div1 prev recent [] = stringify [] (List.rev recent :: prev)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1095
          | div1 prev recent (l as h :: t) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1096
            case match pat l of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1097
              NONE => div1 prev (h :: recent) t
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  1098
            | SOME rest => div1 (List.rev recent :: prev) [] rest
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1099
      in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1100
        fn s => div1 [] [] (String.explode s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1101
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1102
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1103
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1104
fun capitalize s =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1105
    if s = "" then s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1106
    else str (Char.toUpper (String.sub (s,0))) ^ String.extract (s,1,NONE);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1107
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1108
fun mkPrefix p s = p ^ s;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1109
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1110
fun destPrefix p =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1111
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1112
      fun check s =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1113
          if String.isPrefix p s then ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1114
          else raise Error "destPrefix"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1115
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1116
      val sizeP = size p
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1117
    in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1118
      fn s =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1119
         let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1120
           val () = check s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1121
         in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1122
           String.extract (s,sizeP,NONE)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1123
         end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1124
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1125
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1126
fun isPrefix p = can (destPrefix p);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1127
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1128
fun stripPrefix pred s =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1129
    Substring.string (Substring.dropl pred (Substring.full s));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1130
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1131
fun mkSuffix p s = s ^ p;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1132
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1133
fun destSuffix p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1134
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1135
      fun check s =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1136
          if String.isSuffix p s then ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1137
          else raise Error "destSuffix"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1138
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1139
      val sizeP = size p
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1140
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1141
      fn s =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1142
         let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1143
           val () = check s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1144
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1145
           val sizeS = size s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1146
         in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1147
           String.substring (s, 0, sizeS - sizeP)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1148
         end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1149
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1150
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1151
fun isSuffix p = can (destSuffix p);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1152
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1153
fun stripSuffix pred s =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1154
    Substring.string (Substring.dropr pred (Substring.full s));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1155
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1156
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1157
(* Tables.                                                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1158
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1159
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1160
type columnAlignment = {leftAlign : bool, padChar : char}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1161
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1162
fun alignColumn {leftAlign,padChar} column =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1163
    let
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1164
      val (n,_) = maximum Int.compare (List.map size column)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1165
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1166
      fun pad entry row =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1167
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1168
            val padding = nChars padChar (n - size entry)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1169
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1170
            if leftAlign then entry ^ padding ^ row
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1171
            else padding ^ entry ^ row
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1172
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1173
    in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1174
      zipWith pad column
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1175
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1176
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1177
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1178
  fun alignTab aligns rows =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1179
      case aligns of
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1180
        [] => List.map (K "") rows
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1181
      | [{leftAlign = true, padChar = #" "}] => List.map hd rows
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1182
      | align :: aligns =>
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1183
        let
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1184
          val col = List.map hd rows
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1185
          and cols = alignTab aligns (List.map tl rows)
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1186
        in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1187
          alignColumn align col cols
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1188
        end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1189
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1190
  fun alignTable aligns rows =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1191
      if List.null rows then [] else alignTab aligns rows;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1192
end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1193
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1194
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1195
(* Reals.                                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1196
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1197
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1198
val realToString = Real.toString;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1199
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1200
fun percentToString x = Int.toString (Real.round (100.0 * x)) ^ "%";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1201
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1202
fun pos r = Real.max (r,0.0);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1203
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1204
local
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1205
  val invLn2 = 1.0 / Math.ln 2.0;
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1206
in
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1207
  fun log2 x = invLn2 * Math.ln x;
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1208
end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1209
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1210
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1211
(* Sums.                                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1212
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1213
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1214
datatype ('a,'b) sum = Left of 'a | Right of 'b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1215
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1216
fun destLeft (Left l) = l
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1217
  | destLeft _ = raise Error "destLeft";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1218
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1219
fun isLeft (Left _) = true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1220
  | isLeft (Right _) = false;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1221
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1222
fun destRight (Right r) = r
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1223
  | destRight _ = raise Error "destRight";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1224
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1225
fun isRight (Left _) = false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1226
  | isRight (Right _) = true;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1227
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1228
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1229
(* Metis_Useful impure features.                                                   *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1230
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1231
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1232
local
32740
9dd0a2f83429 explicit indication of Unsynchronized.ref;
wenzelm
parents: 30161
diff changeset
  1233
  val generator = Unsynchronized.ref 0
39503
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1234
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1235
  fun newIntThunk () =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1236
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1237
        val n = !generator
39503
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1238
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1239
        val () = generator := n + 1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1240
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1241
        n
39503
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1242
      end;
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1243
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1244
  fun newIntsThunk k () =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1245
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1246
        val n = !generator
39503
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1247
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1248
        val () = generator := n + k
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1249
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1250
        interval n k
39503
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1251
      end;
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1252
in
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1253
  fun newInt () = Metis_Portable.critical newIntThunk ();
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1254
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1255
  fun newInts k =
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1256
      if k <= 0 then []
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1257
      else Metis_Portable.critical (newIntsThunk k) ();
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1258
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1259
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1260
fun withRef (r,new) f x =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1261
  let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1262
    val old = !r
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1263
    val () = r := new
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1264
    val y = f x handle e => (r := old; raise e)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1265
    val () = r := old
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1266
  in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1267
    y
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1268
  end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1269
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1270
fun cloneArray a =
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1271
    let
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1272
      fun index i = Array.sub (a,i)
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1273
    in
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1274
      Array.tabulate (Array.length a, index)
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1275
    end;
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1276
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1277
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1278
(* Environment.                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1279
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1280
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1281
fun host () = Option.getOpt (OS.Process.getEnv "HOSTNAME", "unknown");
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1282
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1283
fun time () = Date.fmt "%H:%M:%S" (Date.fromTimeLocal (Time.now ()));
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1284
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1285
fun date () = Date.fmt "%d/%m/%Y" (Date.fromTimeLocal (Time.now ()));
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1286
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1287
fun readDirectory {directory = dir} =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1288
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1289
      val dirStrm = OS.FileSys.openDir dir
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1290
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1291
      fun readAll acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1292
          case OS.FileSys.readDir dirStrm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1293
            NONE => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1294
          | SOME file =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1295
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1296
              val filename = OS.Path.joinDirFile {dir = dir, file = file}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1297
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1298
              val acc = {filename = filename} :: acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1299
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1300
              readAll acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1301
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1302
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1303
      val filenames = readAll []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1304
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1305
      val () = OS.FileSys.closeDir dirStrm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1306
    in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  1307
      List.rev filenames
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1308
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1309
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1310
fun readTextFile {filename} =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1311
  let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1312
    open TextIO
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1313
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1314
    val h = openIn filename
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1315
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1316
    val contents = inputAll h
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1317
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1318
    val () = closeIn h
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1319
  in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1320
    contents
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1321
  end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1322
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1323
fun writeTextFile {contents,filename} =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1324
  let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1325
    open TextIO
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1326
    val h = openOut filename
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1327
    val () = output (h,contents)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1328
    val () = closeOut h
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1329
  in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1330
    ()
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1331
  end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1332
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1333
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1334
(* Profiling and error reporting.                                            *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1335
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1336
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1337
fun chat s = TextIO.output (TextIO.stdOut, s ^ "\n");
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1338
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1339
fun chide s = TextIO.output (TextIO.stdErr, s ^ "\n");
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1340
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1341
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1342
  fun err x s = chide (x ^ ": " ^ s);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1343
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1344
  fun try f x = f x
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1345
      handle e as Error _ => (err "try" (errorToString e); raise e)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1346
           | e as Bug _ => (err "try" (bugToString e); raise e)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1347
           | e => (err "try" "strange exception raised"; raise e);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1348
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1349
  val warn = err "WARNING";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1350
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1351
  fun die s = (err "\nFATAL ERROR" s; OS.Process.exit OS.Process.failure);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1352
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1353
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1354
fun timed f a =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1355
  let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1356
    val tmr = Timer.startCPUTimer ()
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1357
    val res = f a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1358
    val {usr,sys,...} = Timer.checkCPUTimer tmr
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1359
  in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1360
    (Time.toReal usr + Time.toReal sys, res)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1361
  end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1362
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1363
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1364
  val MIN = 1.0;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1365
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1366
  fun several n t f a =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1367
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1368
      val (t',res) = timed f a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1369
      val t = t + t'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1370
      val n = n + 1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1371
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1372
      if t > MIN then (t / Real.fromInt n, res) else several n t f a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1373
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1374
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1375
  fun timedMany f a = several 0 0.0 f a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1376
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1377
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1378
val executionTime =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1379
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1380
      val startTime = Time.toReal (Time.now ())
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1381
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1382
      fn () => Time.toReal (Time.now ()) - startTime
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1383
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1384
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1385
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1386
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1387
(**** Original file: src/Lazy.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1388
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1389
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1390
(* SUPPORT FOR LAZY EVALUATION                                               *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1391
(* Copyright (c) 2007 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1392
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1393
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1394
signature Metis_Lazy =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1395
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1396
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1397
type 'a lazy
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1398
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1399
val quickly : 'a -> 'a lazy
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1400
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1401
val delay : (unit -> 'a) -> 'a lazy
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1402
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1403
val force : 'a lazy -> 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1404
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1405
val memoize : (unit -> 'a) -> unit -> 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1406
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1407
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1408
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1409
(**** Original file: src/Lazy.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1410
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1411
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1412
(* SUPPORT FOR LAZY EVALUATION                                               *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1413
(* Copyright (c) 2007 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1414
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1415
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1416
structure Metis_Lazy :> Metis_Lazy =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1417
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1418
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1419
datatype 'a thunk =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1420
    Value of 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1421
  | Thunk of unit -> 'a;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1422
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1423
datatype 'a lazy = Metis_Lazy of 'a thunk Unsynchronized.ref;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1424
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1425
fun quickly v = Metis_Lazy (Unsynchronized.ref (Value v));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1426
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1427
fun delay f = Metis_Lazy (Unsynchronized.ref (Thunk f));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1428
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1429
fun force (Metis_Lazy s) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1430
    case !s of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1431
      Value v => v
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1432
    | Thunk f =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1433
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1434
        val v = f ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1435
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1436
        val () = s := Value v
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1437
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1438
        v
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1439
      end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1440
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1441
fun memoize f =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1442
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1443
      val t = delay f
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1444
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1445
      fn () => force t
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1446
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1447
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1448
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1449
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1450
(**** Original file: src/Ordered.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1451
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1452
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1453
(* ORDERED TYPES                                                             *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1454
(* Copyright (c) 2004 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1455
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1456
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1457
signature Metis_Ordered =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1458
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1459
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1460
type t
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1461
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1462
val compare : t * t -> order
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1463
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1464
(*
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1465
  PROVIDES
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1466
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1467
  !x : t. compare (x,x) = EQUAL
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1468
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1469
  !x y : t. compare (x,y) = LESS <=> compare (y,x) = GREATER
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1470
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1471
  !x y : t. compare (x,y) = EQUAL ==> compare (y,x) = EQUAL
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1472
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1473
  !x y z : t. compare (x,y) = EQUAL ==> compare (x,z) = compare (y,z)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1474
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1475
  !x y z : t.
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1476
    compare (x,y) = LESS andalso compare (y,z) = LESS ==>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1477
    compare (x,z) = LESS
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1478
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1479
  !x y z : t.
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1480
    compare (x,y) = GREATER andalso compare (y,z) = GREATER ==>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1481
    compare (x,z) = GREATER
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1482
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1483
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1484
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1485
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1486
(**** Original file: src/Ordered.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1487
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1488
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1489
(* ORDERED TYPES                                                             *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1490
(* Copyright (c) 2004 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1491
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1492
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1493
structure Metis_IntOrdered =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1494
struct type t = int val compare = Int.compare end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1495
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1496
structure Metis_IntPairOrdered =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1497
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1498
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1499
type t = int * int;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1500
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1501
fun compare ((i1,j1),(i2,j2)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1502
    case Int.compare (i1,i2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1503
      LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1504
    | EQUAL => Int.compare (j1,j2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1505
    | GREATER => GREATER;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1506
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1507
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1508
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1509
structure Metis_StringOrdered =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1510
struct type t = string val compare = String.compare end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1511
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1512
(**** Original file: src/Map.sig ****)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1513
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1514
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1515
(* FINITE MAPS IMPLEMENTED WITH RANDOMLY BALANCED TREES                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1516
(* Copyright (c) 2004 Joe Hurd, distributed under the BSD License            *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1517
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1518
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1519
signature Metis_Map =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1520
sig
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1521
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1522
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1523
(* A type of finite maps.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1524
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1525
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1526
type ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1527
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1528
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1529
(* Constructors.                                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1530
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1531
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1532
val new : ('key * 'key -> order) -> ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1533
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1534
val singleton : ('key * 'key -> order) -> 'key * 'a -> ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1535
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1536
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1537
(* Metis_Map size.                                                                 *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1538
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1539
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1540
val null : ('key,'a) map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1541
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1542
val size : ('key,'a) map -> int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1543
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1544
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1545
(* Querying.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1546
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1547
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1548
val peekKey : ('key,'a) map -> 'key -> ('key * 'a) option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1549
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1550
val peek : ('key,'a) map -> 'key -> 'a option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1551
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1552
val get : ('key,'a) map -> 'key -> 'a  (* raises Error *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1553
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1554
val pick : ('key,'a) map -> 'key * 'a  (* an arbitrary key/value pair *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1555
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1556
val nth : ('key,'a) map -> int -> 'key * 'a  (* in the range [0,size-1] *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1557
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1558
val random : ('key,'a) map -> 'key * 'a
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1559
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1560
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1561
(* Adding.                                                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1562
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1563
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1564
val insert : ('key,'a) map -> 'key * 'a -> ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1565
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1566
val insertList : ('key,'a) map -> ('key * 'a) list -> ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1567
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1568
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1569
(* Removing.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1570
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1571
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1572
val delete : ('key,'a) map -> 'key -> ('key,'a) map  (* must be present *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1573
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1574
val remove : ('key,'a) map -> 'key -> ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1575
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1576
val deletePick : ('key,'a) map -> ('key * 'a) * ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1577
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1578
val deleteNth : ('key,'a) map -> int -> ('key * 'a) * ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1579
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1580
val deleteRandom : ('key,'a) map -> ('key * 'a) * ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1581
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1582
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1583
(* Joining (all join operations prefer keys in the second map).              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1584
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1585
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1586
val merge :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1587
    {first : 'key * 'a -> 'c option,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1588
     second : 'key * 'b -> 'c option,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1589
     both : ('key * 'a) * ('key * 'b) -> 'c option} ->
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1590
    ('key,'a) map -> ('key,'b) map -> ('key,'c) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1591
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1592
val union :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1593
    (('key * 'a) * ('key * 'a) -> 'a option) ->
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1594
    ('key,'a) map -> ('key,'a) map -> ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1595
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1596
val intersect :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1597
    (('key * 'a) * ('key * 'b) -> 'c option) ->
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1598
    ('key,'a) map -> ('key,'b) map -> ('key,'c) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1599
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1600
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1601
(* Metis_Set operations on the domain.                                             *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1602
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1603
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1604
val inDomain : 'key -> ('key,'a) map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1605
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1606
val unionDomain : ('key,'a) map -> ('key,'a) map -> ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1607
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1608
val unionListDomain : ('key,'a) map list -> ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1609
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1610
val intersectDomain : ('key,'a) map -> ('key,'a) map -> ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1611
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1612
val intersectListDomain : ('key,'a) map list -> ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1613
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1614
val differenceDomain : ('key,'a) map -> ('key,'a) map -> ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1615
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1616
val symmetricDifferenceDomain : ('key,'a) map -> ('key,'a) map -> ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1617
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1618
val equalDomain : ('key,'a) map -> ('key,'a) map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1619
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1620
val subsetDomain : ('key,'a) map -> ('key,'a) map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1621
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1622
val disjointDomain : ('key,'a) map -> ('key,'a) map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1623
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1624
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1625
(* Mapping and folding.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1626
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1627
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1628
val mapPartial : ('key * 'a -> 'b option) -> ('key,'a) map -> ('key,'b) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1629
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1630
val map : ('key * 'a -> 'b) -> ('key,'a) map -> ('key,'b) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1631
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1632
val app : ('key * 'a -> unit) -> ('key,'a) map -> unit
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1633
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1634
val transform : ('a -> 'b) -> ('key,'a) map -> ('key,'b) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1635
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1636
val filter : ('key * 'a -> bool) -> ('key,'a) map -> ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1637
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1638
val partition :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1639
    ('key * 'a -> bool) -> ('key,'a) map -> ('key,'a) map * ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1640
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1641
val foldl : ('key * 'a * 's -> 's) -> 's -> ('key,'a) map -> 's
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1642
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1643
val foldr : ('key * 'a * 's -> 's) -> 's -> ('key,'a) map -> 's
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1644
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1645
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1646
(* Searching.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1647
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1648
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1649
val findl : ('key * 'a -> bool) -> ('key,'a) map -> ('key * 'a) option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1650
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1651
val findr : ('key * 'a -> bool) -> ('key,'a) map -> ('key * 'a) option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1652
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1653
val firstl : ('key * 'a -> 'b option) -> ('key,'a) map -> 'b option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1654
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1655
val firstr : ('key * 'a -> 'b option) -> ('key,'a) map -> 'b option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1656
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1657
val exists : ('key * 'a -> bool) -> ('key,'a) map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1658
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1659
val all : ('key * 'a -> bool) -> ('key,'a) map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1660
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1661
val count : ('key * 'a -> bool) -> ('key,'a) map -> int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1662
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1663
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1664
(* Comparing.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1665
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1666
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1667
val compare : ('a * 'a -> order) -> ('key,'a) map * ('key,'a) map -> order
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1668
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1669
val equal : ('a -> 'a -> bool) -> ('key,'a) map -> ('key,'a) map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1670
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1671
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1672
(* Converting to and from lists.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1673
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1674
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1675
val keys : ('key,'a) map -> 'key list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1676
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1677
val values : ('key,'a) map -> 'a list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1678
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1679
val toList : ('key,'a) map -> ('key * 'a) list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1680
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1681
val fromList : ('key * 'key -> order) -> ('key * 'a) list -> ('key,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1682
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1683
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1684
(* Pretty-printing.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1685
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1686
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1687
val toString : ('key,'a) map -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1688
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1689
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1690
(* Iterators over maps.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1691
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1692
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1693
type ('key,'a) iterator
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1694
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1695
val mkIterator : ('key,'a) map -> ('key,'a) iterator option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1696
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1697
val mkRevIterator : ('key,'a) map -> ('key,'a) iterator option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1698
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1699
val readIterator : ('key,'a) iterator -> 'key * 'a
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1700
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1701
val advanceIterator : ('key,'a) iterator -> ('key,'a) iterator option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1702
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1703
end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1704
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1705
(**** Original file: src/Map.sml ****)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1706
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1707
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1708
(* FINITE MAPS IMPLEMENTED WITH RANDOMLY BALANCED TREES                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1709
(* Copyright (c) 2004 Joe Hurd, distributed under the BSD License            *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1710
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1711
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1712
structure Metis_Map :> Metis_Map =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1713
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1714
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1715
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1716
(* Importing useful functionality.                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1717
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1718
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1719
exception Bug = Metis_Useful.Bug;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1720
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1721
exception Error = Metis_Useful.Error;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1722
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1723
val pointerEqual = Metis_Portable.pointerEqual;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1724
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1725
val K = Metis_Useful.K;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1726
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1727
val randomInt = Metis_Portable.randomInt;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1728
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1729
val randomWord = Metis_Portable.randomWord;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1730
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1731
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1732
(* Converting a comparison function to an equality function.                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1733
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1734
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1735
fun equalKey compareKey key1 key2 = compareKey (key1,key2) = EQUAL;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1736
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1737
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1738
(* Priorities.                                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1739
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1740
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1741
type priority = Word.word;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1742
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1743
val randomPriority = randomWord;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1744
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1745
val comparePriority = Word.compare;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1746
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1747
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1748
(* Priority search trees.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1749
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1750
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1751
datatype ('key,'value) tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1752
    E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1753
  | T of ('key,'value) node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1754
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1755
and ('key,'value) node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1756
    Node of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1757
      {size : int,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1758
       priority : priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1759
       left : ('key,'value) tree,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1760
       key : 'key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1761
       value : 'value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1762
       right : ('key,'value) tree};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1763
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1764
fun lowerPriorityNode node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1765
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1766
      val Node {priority = p1, ...} = node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1767
      and Node {priority = p2, ...} = node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1768
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1769
      comparePriority (p1,p2) = LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1770
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1771
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1772
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1773
(* Tree debugging functions.                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1774
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1775
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1776
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1777
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1778
  fun checkSizes tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1779
      case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1780
        E => 0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1781
      | T (Node {size,left,right,...}) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1782
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1783
          val l = checkSizes left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1784
          and r = checkSizes right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1785
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1786
          val () = if l + 1 + r = size then () else raise Bug "wrong size"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1787
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1788
          size
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1789
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1790
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1791
  fun checkSorted compareKey x tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1792
      case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1793
        E => x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1794
      | T (Node {left,key,right,...}) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1795
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1796
          val x = checkSorted compareKey x left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1797
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1798
          val () =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1799
              case x of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1800
                NONE => ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1801
              | SOME k =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1802
                case compareKey (k,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1803
                  LESS => ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1804
                | EQUAL => raise Bug "duplicate keys"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1805
                | GREATER => raise Bug "unsorted"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1806
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1807
          val x = SOME key
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1808
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1809
          checkSorted compareKey x right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1810
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1811
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1812
  fun checkPriorities compareKey tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1813
      case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1814
        E => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1815
      | T node =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1816
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1817
          val Node {left,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1818
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1819
          val () =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1820
              case checkPriorities compareKey left of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1821
                NONE => ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1822
              | SOME lnode =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1823
                if not (lowerPriorityNode node lnode) then ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1824
                else raise Bug "left child has greater priority"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1825
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1826
          val () =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1827
              case checkPriorities compareKey right of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1828
                NONE => ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1829
              | SOME rnode =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1830
                if not (lowerPriorityNode node rnode) then ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1831
                else raise Bug "right child has greater priority"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1832
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1833
          SOME node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1834
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1835
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1836
  fun treeCheckInvariants compareKey tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1837
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1838
        val _ = checkSizes tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1839
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1840
        val _ = checkSorted compareKey NONE tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1841
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1842
        val _ = checkPriorities compareKey tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1843
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1844
        tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1845
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1846
      handle Error err => raise Bug err;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1847
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1848
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1849
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1850
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1851
(* Tree operations.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1852
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1853
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1854
fun treeNew () = E;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1855
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1856
fun nodeSize (Node {size = x, ...}) = x;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1857
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1858
fun treeSize tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1859
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1860
      E => 0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1861
    | T x => nodeSize x;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1862
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1863
fun mkNode priority left key value right =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1864
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1865
      val size = treeSize left + 1 + treeSize right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1866
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1867
      Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1868
        {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1869
         priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1870
         left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1871
         key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1872
         value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1873
         right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1874
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1875
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1876
fun mkTree priority left key value right =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1877
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1878
      val node = mkNode priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1879
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1880
      T node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1881
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1882
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1883
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1884
(* Extracting the left and right spines of a tree.                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1885
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1886
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1887
fun treeLeftSpine acc tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1888
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1889
      E => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1890
    | T node => nodeLeftSpine acc node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1891
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1892
and nodeLeftSpine acc node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1893
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1894
      val Node {left,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1895
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1896
      treeLeftSpine (node :: acc) left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1897
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1898
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1899
fun treeRightSpine acc tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1900
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1901
      E => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1902
    | T node => nodeRightSpine acc node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1903
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1904
and nodeRightSpine acc node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1905
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1906
      val Node {right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1907
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1908
      treeRightSpine (node :: acc) right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1909
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1910
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1911
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1912
(* Singleton trees.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1913
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1914
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1915
fun mkNodeSingleton priority key value =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1916
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1917
      val size = 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1918
      and left = E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1919
      and right = E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1920
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1921
      Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1922
        {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1923
         priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1924
         left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1925
         key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1926
         value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1927
         right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1928
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1929
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1930
fun nodeSingleton (key,value) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1931
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1932
      val priority = randomPriority ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1933
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1934
      mkNodeSingleton priority key value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1935
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1936
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1937
fun treeSingleton key_value =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1938
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1939
      val node = nodeSingleton key_value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1940
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1941
      T node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1942
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1943
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1944
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1945
(* Appending two trees, where every element of the first tree is less than   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1946
(* every element of the second tree.                                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1947
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1948
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1949
fun treeAppend tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1950
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1951
      E => tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1952
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1953
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1954
        E => tree1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1955
      | T node2 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1956
        if lowerPriorityNode node1 node2 then
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1957
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1958
            val Node {priority,left,key,value,right,...} = node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1959
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1960
            val left = treeAppend tree1 left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1961
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1962
            mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1963
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1964
        else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1965
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1966
            val Node {priority,left,key,value,right,...} = node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1967
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1968
            val right = treeAppend right tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1969
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1970
            mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1971
          end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1972
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1973
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1974
(* Appending two trees and a node, where every element of the first tree is  *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1975
(* less than the node, which in turn is less than every element of the       *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1976
(* second tree.                                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1977
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1978
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1979
fun treeCombine left node right =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1980
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1981
      val left_node = treeAppend left (T node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1982
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1983
      treeAppend left_node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1984
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1985
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1986
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1987
(* Searching a tree for a value.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1988
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1989
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1990
fun treePeek compareKey pkey tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1991
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1992
      E => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1993
    | T node => nodePeek compareKey pkey node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1994
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1995
and nodePeek compareKey pkey node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1996
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1997
      val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1998
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1999
      case compareKey (pkey,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2000
        LESS => treePeek compareKey pkey left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2001
      | EQUAL => SOME value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2002
      | GREATER => treePeek compareKey pkey right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2003
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2004
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2005
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2006
(* Tree paths.                                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2007
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2008
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2009
(* Generating a path by searching a tree for a key/value pair *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2010
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2011
fun treePeekPath compareKey pkey path tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2012
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2013
      E => (path,NONE)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2014
    | T node => nodePeekPath compareKey pkey path node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2015
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2016
and nodePeekPath compareKey pkey path node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2017
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2018
      val Node {left,key,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2019
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2020
      case compareKey (pkey,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2021
        LESS => treePeekPath compareKey pkey ((true,node) :: path) left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2022
      | EQUAL => (path, SOME node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2023
      | GREATER => treePeekPath compareKey pkey ((false,node) :: path) right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2024
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2025
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2026
(* A path splits a tree into left/right components *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2027
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2028
fun addSidePath ((wentLeft,node),(leftTree,rightTree)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2029
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2030
      val Node {priority,left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2031
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2032
      if wentLeft then (leftTree, mkTree priority rightTree key value right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2033
      else (mkTree priority left key value leftTree, rightTree)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2034
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2035
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2036
fun addSidesPath left_right = List.foldl addSidePath left_right;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2037
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2038
fun mkSidesPath path = addSidesPath (E,E) path;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2039
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2040
(* Updating the subtree at a path *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2041
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2042
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2043
  fun updateTree ((wentLeft,node),tree) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2044
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2045
        val Node {priority,left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2046
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2047
        if wentLeft then mkTree priority tree key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2048
        else mkTree priority left key value tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2049
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2050
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2051
  fun updateTreePath tree = List.foldl updateTree tree;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2052
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2053
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2054
(* Inserting a new node at a path position *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2055
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2056
fun insertNodePath node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2057
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2058
      fun insert left_right path =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2059
          case path of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2060
            [] =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2061
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2062
              val (left,right) = left_right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2063
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2064
              treeCombine left node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2065
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2066
          | (step as (_,snode)) :: rest =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2067
            if lowerPriorityNode snode node then
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2068
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2069
                val left_right = addSidePath (step,left_right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2070
              in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2071
                insert left_right rest
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2072
              end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2073
            else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2074
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2075
                val (left,right) = left_right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2076
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2077
                val tree = treeCombine left node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2078
              in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2079
                updateTreePath tree path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2080
              end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2081
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2082
      insert (E,E)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2083
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2084
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2085
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2086
(* Using a key to split a node into three components: the keys comparing     *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2087
(* less than the supplied key, an optional equal key, and the keys comparing *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2088
(* greater.                                                                  *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2089
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2090
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2091
fun nodePartition compareKey pkey node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2092
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2093
      val (path,pnode) = nodePeekPath compareKey pkey [] node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2094
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2095
      case pnode of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2096
        NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2097
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2098
          val (left,right) = mkSidesPath path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2099
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2100
          (left,NONE,right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2101
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2102
      | SOME node =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2103
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2104
          val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2105
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2106
          val (left,right) = addSidesPath (left,right) path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2107
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2108
          (left, SOME (key,value), right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2109
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2110
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2111
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2112
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2113
(* Searching a tree for a key/value pair.                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2114
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2115
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2116
fun treePeekKey compareKey pkey tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2117
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2118
      E => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2119
    | T node => nodePeekKey compareKey pkey node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2120
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2121
and nodePeekKey compareKey pkey node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2122
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2123
      val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2124
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2125
      case compareKey (pkey,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2126
        LESS => treePeekKey compareKey pkey left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2127
      | EQUAL => SOME (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2128
      | GREATER => treePeekKey compareKey pkey right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2129
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2130
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2131
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2132
(* Inserting new key/values into the tree.                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2133
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2134
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2135
fun treeInsert compareKey key_value tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2136
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2137
      val (key,value) = key_value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2138
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2139
      val (path,inode) = treePeekPath compareKey key [] tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2140
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2141
      case inode of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2142
        NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2143
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2144
          val node = nodeSingleton (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2145
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2146
          insertNodePath node path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2147
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2148
      | SOME node =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2149
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2150
          val Node {size,priority,left,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2151
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2152
          val node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2153
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2154
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2155
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2156
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2157
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2158
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2159
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2160
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2161
          updateTreePath (T node) path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2162
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2163
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2164
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2165
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2166
(* Deleting key/value pairs: it raises an exception if the supplied key is   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2167
(* not present.                                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2168
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2169
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2170
fun treeDelete compareKey dkey tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2171
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2172
      E => raise Bug "Metis_Map.delete: element not found"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2173
    | T node => nodeDelete compareKey dkey node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2174
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2175
and nodeDelete compareKey dkey node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2176
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2177
      val Node {size,priority,left,key,value,right} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2178
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2179
      case compareKey (dkey,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2180
        LESS =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2181
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2182
          val size = size - 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2183
          and left = treeDelete compareKey dkey left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2184
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2185
          val node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2186
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2187
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2188
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2189
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2190
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2191
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2192
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2193
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2194
          T node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2195
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2196
      | EQUAL => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2197
      | GREATER =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2198
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2199
          val size = size - 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2200
          and right = treeDelete compareKey dkey right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2201
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2202
          val node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2203
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2204
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2205
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2206
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2207
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2208
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2209
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2210
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2211
          T node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2212
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2213
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2214
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2215
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2216
(* Partial map is the basic operation for preserving tree structure.         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2217
(* It applies its argument function to the elements *in order*.              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2218
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2219
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2220
fun treeMapPartial f tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2221
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2222
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2223
    | T node => nodeMapPartial f node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2224
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2225
and nodeMapPartial f (Node {priority,left,key,value,right,...}) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2226
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2227
      val left = treeMapPartial f left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2228
      and vo = f (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2229
      and right = treeMapPartial f right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2230
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2231
      case vo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2232
        NONE => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2233
      | SOME value => mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2234
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2235
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2236
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2237
(* Mapping tree values.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2238
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2239
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2240
fun treeMap f tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2241
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2242
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2243
    | T node => T (nodeMap f node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2244
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2245
and nodeMap f node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2246
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2247
      val Node {size,priority,left,key,value,right} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2248
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2249
      val left = treeMap f left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2250
      and value = f (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2251
      and right = treeMap f right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2252
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2253
      Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2254
        {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2255
         priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2256
         left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2257
         key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2258
         value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2259
         right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2260
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2261
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2262
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2263
(* Merge is the basic operation for joining two trees. Note that the merged  *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2264
(* key is always the one from the second map.                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2265
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2266
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2267
fun treeMerge compareKey f1 f2 fb tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2268
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2269
      E => treeMapPartial f2 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2270
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2271
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2272
        E => treeMapPartial f1 tree1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2273
      | T node2 => nodeMerge compareKey f1 f2 fb node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2274
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2275
and nodeMerge compareKey f1 f2 fb node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2276
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2277
      val Node {priority,left,key,value,right,...} = node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2278
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2279
      val (l,kvo,r) = nodePartition compareKey key node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2280
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2281
      val left = treeMerge compareKey f1 f2 fb l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2282
      and right = treeMerge compareKey f1 f2 fb r right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2283
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2284
      val vo =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2285
          case kvo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2286
            NONE => f2 (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2287
          | SOME kv => fb (kv,(key,value))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2288
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2289
      case vo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2290
        NONE => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2291
      | SOME value =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2292
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2293
          val node = mkNodeSingleton priority key value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2294
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2295
          treeCombine left node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2296
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2297
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2298
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2299
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2300
(* A union operation on trees.                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2301
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2302
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2303
fun treeUnion compareKey f f2 tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2304
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2305
      E => tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2306
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2307
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2308
        E => tree1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2309
      | T node2 => nodeUnion compareKey f f2 node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2310
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2311
and nodeUnion compareKey f f2 node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2312
    if pointerEqual (node1,node2) then nodeMapPartial f2 node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2313
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2314
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2315
        val Node {priority,left,key,value,right,...} = node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2316
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2317
        val (l,kvo,r) = nodePartition compareKey key node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2318
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2319
        val left = treeUnion compareKey f f2 l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2320
        and right = treeUnion compareKey f f2 r right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2321
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2322
        val vo =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2323
            case kvo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2324
              NONE => SOME value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2325
            | SOME kv => f (kv,(key,value))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2326
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2327
        case vo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2328
          NONE => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2329
        | SOME value =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2330
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2331
            val node = mkNodeSingleton priority key value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2332
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2333
            treeCombine left node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2334
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2335
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2336
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2337
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2338
(* An intersect operation on trees.                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2339
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2340
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2341
fun treeIntersect compareKey f t1 t2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2342
    case t1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2343
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2344
    | T n1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2345
      case t2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2346
        E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2347
      | T n2 => nodeIntersect compareKey f n1 n2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2348
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2349
and nodeIntersect compareKey f n1 n2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2350
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2351
      val Node {priority,left,key,value,right,...} = n2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2352
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2353
      val (l,kvo,r) = nodePartition compareKey key n1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2354
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2355
      val left = treeIntersect compareKey f l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2356
      and right = treeIntersect compareKey f r right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2357
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2358
      val vo =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2359
          case kvo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2360
            NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2361
          | SOME kv => f (kv,(key,value))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2362
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2363
      case vo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2364
        NONE => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2365
      | SOME value => mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2366
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2367
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2368
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2369
(* A union operation on trees which simply chooses the second value.         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2370
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2371
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2372
fun treeUnionDomain compareKey tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2373
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2374
      E => tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2375
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2376
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2377
        E => tree1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2378
      | T node2 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2379
        if pointerEqual (node1,node2) then tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2380
        else nodeUnionDomain compareKey node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2381
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2382
and nodeUnionDomain compareKey node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2383
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2384
      val Node {priority,left,key,value,right,...} = node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2385
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2386
      val (l,_,r) = nodePartition compareKey key node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2387
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2388
      val left = treeUnionDomain compareKey l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2389
      and right = treeUnionDomain compareKey r right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2390
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2391
      val node = mkNodeSingleton priority key value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2392
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2393
      treeCombine left node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2394
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2395
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2396
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2397
(* An intersect operation on trees which simply chooses the second value.    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2398
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2399
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2400
fun treeIntersectDomain compareKey tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2401
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2402
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2403
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2404
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2405
        E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2406
      | T node2 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2407
        if pointerEqual (node1,node2) then tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2408
        else nodeIntersectDomain compareKey node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2409
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2410
and nodeIntersectDomain compareKey node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2411
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2412
      val Node {priority,left,key,value,right,...} = node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2413
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2414
      val (l,kvo,r) = nodePartition compareKey key node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2415
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2416
      val left = treeIntersectDomain compareKey l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2417
      and right = treeIntersectDomain compareKey r right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2418
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2419
      if Option.isSome kvo then mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2420
      else treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2421
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2422
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2423
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2424
(* A difference operation on trees.                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2425
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2426
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2427
fun treeDifferenceDomain compareKey t1 t2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2428
    case t1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2429
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2430
    | T n1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2431
      case t2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2432
        E => t1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2433
      | T n2 => nodeDifferenceDomain compareKey n1 n2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2434
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2435
and nodeDifferenceDomain compareKey n1 n2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2436
    if pointerEqual (n1,n2) then E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2437
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2438
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2439
        val Node {priority,left,key,value,right,...} = n1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2440
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2441
        val (l,kvo,r) = nodePartition compareKey key n2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2442
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2443
        val left = treeDifferenceDomain compareKey left l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2444
        and right = treeDifferenceDomain compareKey right r
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2445
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2446
        if Option.isSome kvo then treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2447
        else mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2448
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2449
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2450
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2451
(* A subset operation on trees.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2452
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2453
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2454
fun treeSubsetDomain compareKey tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2455
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2456
      E => true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2457
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2458
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2459
        E => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2460
      | T node2 => nodeSubsetDomain compareKey node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2461
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2462
and nodeSubsetDomain compareKey node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2463
    pointerEqual (node1,node2) orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2464
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2465
      val Node {size,left,key,right,...} = node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2466
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2467
      size <= nodeSize node2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2468
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2469
        val (l,kvo,r) = nodePartition compareKey key node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2470
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2471
        Option.isSome kvo andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2472
        treeSubsetDomain compareKey left l andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2473
        treeSubsetDomain compareKey right r
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2474
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2475
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2476
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2477
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2478
(* Picking an arbitrary key/value pair from a tree.                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2479
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2480
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2481
fun nodePick node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2482
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2483
      val Node {key,value,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2484
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2485
      (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2486
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2487
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2488
fun treePick tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2489
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2490
      E => raise Bug "Metis_Map.treePick"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2491
    | T node => nodePick node;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2492
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2493
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2494
(* Removing an arbitrary key/value pair from a tree.                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2495
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2496
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2497
fun nodeDeletePick node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2498
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2499
      val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2500
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2501
      ((key,value), treeAppend left right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2502
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2503
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2504
fun treeDeletePick tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2505
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2506
      E => raise Bug "Metis_Map.treeDeletePick"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2507
    | T node => nodeDeletePick node;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2508
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2509
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2510
(* Finding the nth smallest key/value (counting from 0).                     *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2511
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2512
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2513
fun treeNth n tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2514
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2515
      E => raise Bug "Metis_Map.treeNth"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2516
    | T node => nodeNth n node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2517
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2518
and nodeNth n node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2519
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2520
      val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2521
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2522
      val k = treeSize left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2523
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2524
      if n = k then (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2525
      else if n < k then treeNth n left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2526
      else treeNth (n - (k + 1)) right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2527
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2528
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2529
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2530
(* Removing the nth smallest key/value (counting from 0).                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2531
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2532
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2533
fun treeDeleteNth n tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2534
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2535
      E => raise Bug "Metis_Map.treeDeleteNth"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2536
    | T node => nodeDeleteNth n node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2537
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2538
and nodeDeleteNth n node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2539
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2540
      val Node {size,priority,left,key,value,right} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2541
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2542
      val k = treeSize left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2543
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2544
      if n = k then ((key,value), treeAppend left right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2545
      else if n < k then
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2546
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2547
          val (key_value,left) = treeDeleteNth n left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2548
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2549
          val size = size - 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2550
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2551
          val node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2552
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2553
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2554
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2555
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2556
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2557
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2558
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2559
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2560
          (key_value, T node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2561
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2562
      else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2563
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2564
          val n = n - (k + 1)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2565
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2566
          val (key_value,right) = treeDeleteNth n right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2567
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2568
          val size = size - 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2569
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2570
          val node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2571
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2572
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2573
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2574
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2575
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2576
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2577
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2578
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2579
          (key_value, T node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2580
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2581
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2582
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2583
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2584
(* Iterators.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2585
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2586
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2587
datatype ('key,'value) iterator =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2588
    LeftToRightIterator of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2589
      ('key * 'value) * ('key,'value) tree * ('key,'value) node list
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2590
  | RightToLeftIterator of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2591
      ('key * 'value) * ('key,'value) tree * ('key,'value) node list;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2592
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2593
fun fromSpineLeftToRightIterator nodes =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2594
    case nodes of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2595
      [] => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2596
    | Node {key,value,right,...} :: nodes =>
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2597
      SOME (LeftToRightIterator ((key,value),right,nodes));
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2598
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2599
fun fromSpineRightToLeftIterator nodes =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2600
    case nodes of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2601
      [] => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2602
    | Node {key,value,left,...} :: nodes =>
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2603
      SOME (RightToLeftIterator ((key,value),left,nodes));
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2604
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2605
fun addLeftToRightIterator nodes tree = fromSpineLeftToRightIterator (treeLeftSpine nodes tree);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2606
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2607
fun addRightToLeftIterator nodes tree = fromSpineRightToLeftIterator (treeRightSpine nodes tree);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2608
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2609
fun treeMkIterator tree = addLeftToRightIterator [] tree;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2610
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2611
fun treeMkRevIterator tree = addRightToLeftIterator [] tree;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2612
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2613
fun readIterator iter =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2614
    case iter of
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2615
      LeftToRightIterator (key_value,_,_) => key_value
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2616
    | RightToLeftIterator (key_value,_,_) => key_value;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2617
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2618
fun advanceIterator iter =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2619
    case iter of
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2620
      LeftToRightIterator (_,tree,nodes) => addLeftToRightIterator nodes tree
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2621
    | RightToLeftIterator (_,tree,nodes) => addRightToLeftIterator nodes tree;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2622
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2623
fun foldIterator f acc io =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2624
    case io of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2625
      NONE => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2626
    | SOME iter =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2627
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2628
        val (key,value) = readIterator iter
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2629
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2630
        foldIterator f (f (key,value,acc)) (advanceIterator iter)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2631
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2632
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2633
fun findIterator pred io =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2634
    case io of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2635
      NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2636
    | SOME iter =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2637
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2638
        val key_value = readIterator iter
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2639
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2640
        if pred key_value then SOME key_value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2641
        else findIterator pred (advanceIterator iter)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2642
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2643
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2644
fun firstIterator f io =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2645
    case io of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2646
      NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2647
    | SOME iter =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2648
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2649
        val key_value = readIterator iter
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2650
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2651
        case f key_value of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2652
          NONE => firstIterator f (advanceIterator iter)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2653
        | s => s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2654
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2655
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2656
fun compareIterator compareKey compareValue io1 io2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2657
    case (io1,io2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2658
      (NONE,NONE) => EQUAL
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2659
    | (NONE, SOME _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2660
    | (SOME _, NONE) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2661
    | (SOME i1, SOME i2) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2662
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2663
        val (k1,v1) = readIterator i1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2664
        and (k2,v2) = readIterator i2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2665
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2666
        case compareKey (k1,k2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2667
          LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2668
        | EQUAL =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2669
          (case compareValue (v1,v2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2670
             LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2671
           | EQUAL =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2672
             let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2673
               val io1 = advanceIterator i1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2674
               and io2 = advanceIterator i2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2675
             in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2676
               compareIterator compareKey compareValue io1 io2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2677
             end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2678
           | GREATER => GREATER)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2679
        | GREATER => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2680
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2681
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2682
fun equalIterator equalKey equalValue io1 io2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2683
    case (io1,io2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2684
      (NONE,NONE) => true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2685
    | (NONE, SOME _) => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2686
    | (SOME _, NONE) => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2687
    | (SOME i1, SOME i2) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2688
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2689
        val (k1,v1) = readIterator i1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2690
        and (k2,v2) = readIterator i2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2691
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2692
        equalKey k1 k2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2693
        equalValue v1 v2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2694
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2695
          val io1 = advanceIterator i1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2696
          and io2 = advanceIterator i2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2697
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2698
          equalIterator equalKey equalValue io1 io2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2699
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2700
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2701
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2702
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2703
(* A type of finite maps.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2704
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2705
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2706
datatype ('key,'value) map =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2707
    Metis_Map of ('key * 'key -> order) * ('key,'value) tree;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2708
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2709
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2710
(* Metis_Map debugging functions.                                                  *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2711
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2712
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2713
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2714
fun checkInvariants s m =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2715
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2716
      val Metis_Map (compareKey,tree) = m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2717
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2718
      val _ = treeCheckInvariants compareKey tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2719
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2720
      m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2721
    end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2722
    handle Bug bug => raise Bug (s ^ "\n" ^ "Metis_Map.checkInvariants: " ^ bug);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2723
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2724
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2725
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2726
(* Constructors.                                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2727
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2728
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2729
fun new compareKey =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2730
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2731
      val tree = treeNew ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2732
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2733
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2734
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2735
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2736
fun singleton compareKey key_value =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2737
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2738
      val tree = treeSingleton key_value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2739
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2740
      Metis_Map (compareKey,tree)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2741
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2742
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2743
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2744
(* Metis_Map size.                                                                 *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2745
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2746
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2747
fun size (Metis_Map (_,tree)) = treeSize tree;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2748
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2749
fun null m = size m = 0;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2750
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2751
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2752
(* Querying.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2753
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2754
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2755
fun peekKey (Metis_Map (compareKey,tree)) key = treePeekKey compareKey key tree;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2756
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2757
fun peek (Metis_Map (compareKey,tree)) key = treePeek compareKey key tree;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2758
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2759
fun inDomain key m = Option.isSome (peek m key);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2760
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2761
fun get m key =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2762
    case peek m key of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2763
      NONE => raise Error "Metis_Map.get: element not found"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2764
    | SOME value => value;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2765
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2766
fun pick (Metis_Map (_,tree)) = treePick tree;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2767
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2768
fun nth (Metis_Map (_,tree)) n = treeNth n tree;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2769
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2770
fun random m =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2771
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2772
      val n = size m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2773
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2774
      if n = 0 then raise Bug "Metis_Map.random: empty"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2775
      else nth m (randomInt n)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2776
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2777
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2778
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2779
(* Adding.                                                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2780
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2781
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2782
fun insert (Metis_Map (compareKey,tree)) key_value =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2783
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2784
      val tree = treeInsert compareKey key_value tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2785
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2786
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2787
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2788
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2789
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2790
val insert = fn m => fn kv =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2791
    checkInvariants "Metis_Map.insert: result"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2792
      (insert (checkInvariants "Metis_Map.insert: input" m) kv);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2793
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2794
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2795
fun insertList m =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2796
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2797
      fun ins (key_value,acc) = insert acc key_value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2798
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2799
      List.foldl ins m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2800
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2801
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2802
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2803
(* Removing.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2804
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2805
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2806
fun delete (Metis_Map (compareKey,tree)) dkey =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2807
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2808
      val tree = treeDelete compareKey dkey tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2809
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2810
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2811
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2812
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2813
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2814
val delete = fn m => fn k =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2815
    checkInvariants "Metis_Map.delete: result"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2816
      (delete (checkInvariants "Metis_Map.delete: input" m) k);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2817
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2818
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2819
fun remove m key = if inDomain key m then delete m key else m;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2820
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2821
fun deletePick (Metis_Map (compareKey,tree)) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2822
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2823
      val (key_value,tree) = treeDeletePick tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2824
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2825
      (key_value, Metis_Map (compareKey,tree))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2826
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2827
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2828
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2829
val deletePick = fn m =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2830
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2831
      val (kv,m) = deletePick (checkInvariants "Metis_Map.deletePick: input" m)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2832
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2833
      (kv, checkInvariants "Metis_Map.deletePick: result" m)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2834
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2835
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2836
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2837
fun deleteNth (Metis_Map (compareKey,tree)) n =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2838
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2839
      val (key_value,tree) = treeDeleteNth n tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2840
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2841
      (key_value, Metis_Map (compareKey,tree))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2842
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2843
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2844
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2845
val deleteNth = fn m => fn n =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2846
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2847
      val (kv,m) = deleteNth (checkInvariants "Metis_Map.deleteNth: input" m) n
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2848
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2849
      (kv, checkInvariants "Metis_Map.deleteNth: result" m)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2850
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2851
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2852
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2853
fun deleteRandom m =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2854
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2855
      val n = size m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2856
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2857
      if n = 0 then raise Bug "Metis_Map.deleteRandom: empty"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2858
      else deleteNth m (randomInt n)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2859
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2860
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2861
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2862
(* Joining (all join operations prefer keys in the second map).              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2863
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2864
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2865
fun merge {first,second,both} (Metis_Map (compareKey,tree1)) (Metis_Map (_,tree2)) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2866
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2867
      val tree = treeMerge compareKey first second both tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2868
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2869
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2870
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2871
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2872
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2873
val merge = fn f => fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2874
    checkInvariants "Metis_Map.merge: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2875
      (merge f
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2876
         (checkInvariants "Metis_Map.merge: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2877
         (checkInvariants "Metis_Map.merge: input 2" m2));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2878
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2879
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2880
fun union f (Metis_Map (compareKey,tree1)) (Metis_Map (_,tree2)) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2881
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2882
      fun f2 kv = f (kv,kv)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2883
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2884
      val tree = treeUnion compareKey f f2 tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2885
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2886
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2887
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2888
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2889
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2890
val union = fn f => fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2891
    checkInvariants "Metis_Map.union: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2892
      (union f
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2893
         (checkInvariants "Metis_Map.union: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2894
         (checkInvariants "Metis_Map.union: input 2" m2));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2895
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2896
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2897
fun intersect f (Metis_Map (compareKey,tree1)) (Metis_Map (_,tree2)) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2898
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2899
      val tree = treeIntersect compareKey f tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2900
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2901
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2902
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2903
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2904
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2905
val intersect = fn f => fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2906
    checkInvariants "Metis_Map.intersect: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2907
      (intersect f
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2908
         (checkInvariants "Metis_Map.intersect: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2909
         (checkInvariants "Metis_Map.intersect: input 2" m2));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2910
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2911
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2912
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2913
(* Iterators over maps.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2914
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2915
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2916
fun mkIterator (Metis_Map (_,tree)) = treeMkIterator tree;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2917
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2918
fun mkRevIterator (Metis_Map (_,tree)) = treeMkRevIterator tree;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2919
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2920
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2921
(* Mapping and folding.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2922
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2923
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2924
fun mapPartial f (Metis_Map (compareKey,tree)) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2925
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2926
      val tree = treeMapPartial f tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2927
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2928
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2929
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2930
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2931
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2932
val mapPartial = fn f => fn m =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2933
    checkInvariants "Metis_Map.mapPartial: result"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2934
      (mapPartial f (checkInvariants "Metis_Map.mapPartial: input" m));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2935
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2936
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2937
fun map f (Metis_Map (compareKey,tree)) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2938
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2939
      val tree = treeMap f tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2940
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2941
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2942
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2943
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2944
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2945
val map = fn f => fn m =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2946
    checkInvariants "Metis_Map.map: result"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2947
      (map f (checkInvariants "Metis_Map.map: input" m));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2948
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2949
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2950
fun transform f = map (fn (_,value) => f value);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2951
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2952
fun filter pred =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2953
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2954
      fun f (key_value as (_,value)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2955
          if pred key_value then SOME value else NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2956
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2957
      mapPartial f
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2958
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2959
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2960
fun partition p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2961
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2962
      fun np x = not (p x)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2963
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2964
      fn m => (filter p m, filter np m)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2965
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2966
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2967
fun foldl f b m = foldIterator f b (mkIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2968
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2969
fun foldr f b m = foldIterator f b (mkRevIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2970
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2971
fun app f m = foldl (fn (key,value,()) => f (key,value)) () m;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2972
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2973
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2974
(* Searching.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2975
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2976
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2977
fun findl p m = findIterator p (mkIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2978
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2979
fun findr p m = findIterator p (mkRevIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2980
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2981
fun firstl f m = firstIterator f (mkIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2982
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2983
fun firstr f m = firstIterator f (mkRevIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2984
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2985
fun exists p m = Option.isSome (findl p m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2986
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2987
fun all p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2988
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2989
      fun np x = not (p x)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2990
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2991
      fn m => not (exists np m)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2992
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2993
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2994
fun count pred =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2995
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2996
      fun f (k,v,acc) = if pred (k,v) then acc + 1 else acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2997
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2998
      foldl f 0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2999
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3000
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3001
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3002
(* Comparing.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3003
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3004
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3005
fun compare compareValue (m1,m2) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3006
    if pointerEqual (m1,m2) then EQUAL
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3007
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3008
      case Int.compare (size m1, size m2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3009
        LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3010
      | EQUAL =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3011
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3012
          val Metis_Map (compareKey,_) = m1
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3013
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3014
          val io1 = mkIterator m1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3015
          and io2 = mkIterator m2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3016
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3017
          compareIterator compareKey compareValue io1 io2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3018
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3019
      | GREATER => GREATER;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3020
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3021
fun equal equalValue m1 m2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3022
    pointerEqual (m1,m2) orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3023
    (size m1 = size m2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3024
     let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3025
       val Metis_Map (compareKey,_) = m1
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3026
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3027
       val io1 = mkIterator m1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3028
       and io2 = mkIterator m2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3029
     in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3030
       equalIterator (equalKey compareKey) equalValue io1 io2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3031
     end);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3032
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3033
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3034
(* Metis_Set operations on the domain.                                             *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3035
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3036
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3037
fun unionDomain (Metis_Map (compareKey,tree1)) (Metis_Map (_,tree2)) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3038
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3039
      val tree = treeUnionDomain compareKey tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3040
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3041
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3042
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3043
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3044
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3045
val unionDomain = fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3046
    checkInvariants "Metis_Map.unionDomain: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3047
      (unionDomain
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3048
         (checkInvariants "Metis_Map.unionDomain: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3049
         (checkInvariants "Metis_Map.unionDomain: input 2" m2));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3050
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3051
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3052
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3053
  fun uncurriedUnionDomain (m,acc) = unionDomain acc m;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3054
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3055
  fun unionListDomain ms =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3056
      case ms of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3057
        [] => raise Bug "Metis_Map.unionListDomain: no sets"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3058
      | m :: ms => List.foldl uncurriedUnionDomain m ms;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3059
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3060
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3061
fun intersectDomain (Metis_Map (compareKey,tree1)) (Metis_Map (_,tree2)) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3062
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3063
      val tree = treeIntersectDomain compareKey tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3064
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3065
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3066
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3067
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3068
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3069
val intersectDomain = fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3070
    checkInvariants "Metis_Map.intersectDomain: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3071
      (intersectDomain
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3072
         (checkInvariants "Metis_Map.intersectDomain: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3073
         (checkInvariants "Metis_Map.intersectDomain: input 2" m2));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3074
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3075
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3076
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3077
  fun uncurriedIntersectDomain (m,acc) = intersectDomain acc m;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3078
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3079
  fun intersectListDomain ms =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3080
      case ms of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3081
        [] => raise Bug "Metis_Map.intersectListDomain: no sets"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3082
      | m :: ms => List.foldl uncurriedIntersectDomain m ms;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3083
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3084
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3085
fun differenceDomain (Metis_Map (compareKey,tree1)) (Metis_Map (_,tree2)) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3086
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3087
      val tree = treeDifferenceDomain compareKey tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3088
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3089
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3090
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3091
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3092
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3093
val differenceDomain = fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3094
    checkInvariants "Metis_Map.differenceDomain: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3095
      (differenceDomain
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3096
         (checkInvariants "Metis_Map.differenceDomain: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3097
         (checkInvariants "Metis_Map.differenceDomain: input 2" m2));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3098
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3099
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3100
fun symmetricDifferenceDomain m1 m2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3101
    unionDomain (differenceDomain m1 m2) (differenceDomain m2 m1);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3102
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3103
fun equalDomain m1 m2 = equal (K (K true)) m1 m2;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3104
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3105
fun subsetDomain (Metis_Map (compareKey,tree1)) (Metis_Map (_,tree2)) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3106
    treeSubsetDomain compareKey tree1 tree2;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3107
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3108
fun disjointDomain m1 m2 = null (intersectDomain m1 m2);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3109
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3110
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3111
(* Converting to and from lists.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3112
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3113
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3114
fun keys m = foldr (fn (key,_,l) => key :: l) [] m;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3115
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3116
fun values m = foldr (fn (_,value,l) => value :: l) [] m;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3117
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3118
fun toList m = foldr (fn (key,value,l) => (key,value) :: l) [] m;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3119
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3120
fun fromList compareKey l =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3121
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3122
      val m = new compareKey
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3123
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3124
      insertList m l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3125
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3126
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3127
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3128
(* Pretty-printing.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3129
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3130
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3131
fun toString m = "<" ^ (if null m then "" else Int.toString (size m)) ^ ">";
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3132
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3133
end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3134
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  3135
(**** Original file: src/KeyMap.sig ****)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3136
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3137
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3138
(* FINITE MAPS WITH A FIXED KEY TYPE                                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3139
(* Copyright (c) 2004 Joe Hurd, distributed under the BSD License            *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3140
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3141
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3142
signature Metis_KeyMap =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3143
sig
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3144
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3145
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3146
(* A type of map keys.                                                       *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3147
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3148
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3149
type key
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3150
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  3151
val compareKey : key * key -> order
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  3152
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  3153
val equalKey : key -> key -> bool
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  3154
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3155
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3156
(* A type of finite maps.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3157
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3158
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3159
type 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3160
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3161
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3162
(* Constructors.                                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3163
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3164
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3165
val new : unit -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3166
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3167
val singleton : key * 'a -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3168
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3169
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3170
(* Metis_Map size.                                                                 *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3171
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3172
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3173
val null : 'a map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3174
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3175
val size : 'a map -> int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3176
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3177
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3178
(* Querying.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3179
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3180
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3181
val peekKey : 'a map -> key -> (key * 'a) option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3182
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3183
val peek : 'a map -> key -> 'a option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3184
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3185
val get : 'a map -> key -> 'a  (* raises Error *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3186
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3187
val pick : 'a map -> key * 'a  (* an arbitrary key/value pair *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3188
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3189
val nth : 'a map -> int -> key * 'a  (* in the range [0,size-1] *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3190
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3191
val random : 'a map -> key * 'a
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3192
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3193
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3194
(* Adding.                                                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3195
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3196
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3197
val insert : 'a map -> key * 'a -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3198
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3199
val insertList : 'a map -> (key * 'a) list -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3200
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3201
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3202
(* Removing.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3203
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3204
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3205
val delete : 'a map -> key -> 'a map  (* must be present *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3206
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3207
val remove : 'a map -> key -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3208
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3209
val deletePick : 'a map -> (key * 'a) * 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3210
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3211
val deleteNth : 'a map -> int -> (key * 'a) * 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3212
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3213
val deleteRandom : 'a map -> (key * 'a) * 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3214
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3215
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3216
(* Joining (all join operations prefer keys in the second map).              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3217
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3218
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3219
val merge :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3220
    {first : key * 'a -> 'c option,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3221
     second : key * 'b -> 'c option,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3222
     both : (key * 'a) * (key * 'b) -> 'c option} ->
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3223
    'a map -> 'b map -> 'c map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3224
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3225
val union :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3226
    ((key * 'a) * (key * 'a) -> 'a option) ->
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3227
    'a map -> 'a map -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3228
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3229
val intersect :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3230
    ((key * 'a) * (key * 'b) -> 'c option) ->
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3231
    'a map -> 'b map -> 'c map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3232
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3233
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3234
(* Metis_Set operations on the domain.                                             *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3235
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3236
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3237
val inDomain : key -> 'a map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3238
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3239
val unionDomain : 'a map -> 'a map -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3240
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3241
val unionListDomain : 'a map list -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3242
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3243
val intersectDomain : 'a map -> 'a map -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3244
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3245
val intersectListDomain : 'a map list -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3246
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3247
val differenceDomain : 'a map -> 'a map -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3248
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3249
val symmetricDifferenceDomain : 'a map -> 'a map -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3250
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3251
val equalDomain : 'a map -> 'a map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3252
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3253
val subsetDomain : 'a map -> 'a map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3254
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3255
val disjointDomain : 'a map -> 'a map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3256
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3257
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3258
(* Mapping and folding.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3259
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3260
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3261
val mapPartial : (key * 'a -> 'b option) -> 'a map -> 'b map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3262
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3263
val map : (key * 'a -> 'b) -> 'a map -> 'b map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3264
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3265
val app : (key * 'a -> unit) -> 'a map -> unit
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3266
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3267
val transform : ('a -> 'b) -> 'a map -> 'b map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3268
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3269
val filter : (key * 'a -> bool) -> 'a map -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3270
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3271
val partition :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3272
    (key * 'a -> bool) -> 'a map -> 'a map * 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3273
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3274
val foldl : (key * 'a * 's -> 's) -> 's -> 'a map -> 's
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3275
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3276
val foldr : (key * 'a * 's -> 's) -> 's -> 'a map -> 's
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3277
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3278
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3279
(* Searching.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3280
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3281
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3282
val findl : (key * 'a -> bool) -> 'a map -> (key * 'a) option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3283
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3284
val findr : (key * 'a -> bool) -> 'a map -> (key * 'a) option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3285
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3286
val firstl : (key * 'a -> 'b option) -> 'a map -> 'b option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3287
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3288
val firstr : (key * 'a -> 'b option) -> 'a map -> 'b option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3289
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3290
val exists : (key * 'a -> bool) -> 'a map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3291
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3292
val all : (key * 'a -> bool) -> 'a map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3293
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3294
val count : (key * 'a -> bool) -> 'a map -> int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3295
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3296
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3297
(* Comparing.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3298
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3299
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3300
val compare : ('a * 'a -> order) -> 'a map * 'a map -> order
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3301
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3302
val equal : ('a -> 'a -> bool) -> 'a map -> 'a map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3303
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3304
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3305
(* Converting to and from lists.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3306
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3307
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3308
val keys : 'a map -> key list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3309
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3310
val values : 'a map -> 'a list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3311
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3312
val toList : 'a map -> (key * 'a) list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3313
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3314
val fromList : (key * 'a) list -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3315
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3316
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3317
(* Pretty-printing.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3318
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3319
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3320
val toString : 'a map -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3321
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3322
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3323
(* Iterators over maps.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3324
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3325
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3326
type 'a iterator
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3327
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3328
val mkIterator : 'a map -> 'a iterator option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3329
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3330
val mkRevIterator : 'a map -> 'a iterator option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3331
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3332
val readIterator : 'a iterator -> key * 'a
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3333
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3334
val advanceIterator : 'a iterator -> 'a iterator option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3335
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3336
end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3337
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  3338
(**** Original file: src/KeyMap.sml ****)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3339
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3340
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3341
(* FINITE MAPS WITH A FIXED KEY TYPE                                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3342
(* Copyright (c) 2004 Joe Hurd, distributed under the BSD License            *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3343
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3344
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3345
functor Metis_KeyMap (Key : Metis_Ordered) :> Metis_KeyMap where type key = Key.t =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3346
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3347
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3348
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3349
(* Importing from the input signature.                                       *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3350
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3352
type key = Key.t;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3353
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3354
val compareKey = Key.compare;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3355
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3356
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3357
(* Importing useful functionality.                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3358
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3359
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3360
exception Bug = Metis_Useful.Bug;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3361
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3362
exception Error = Metis_Useful.Error;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3363
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3364
val pointerEqual = Metis_Portable.pointerEqual;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3365
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3366
val K = Metis_Useful.K;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3367
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3368
val randomInt = Metis_Portable.randomInt;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3369
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3370
val randomWord = Metis_Portable.randomWord;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3371
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3372
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3373
(* Converting a comparison function to an equality function.                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3374
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3375
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3376
fun equalKey key1 key2 = compareKey (key1,key2) = EQUAL;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3377
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3378
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3379
(* Priorities.                                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3380
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3381
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3382
type priority = Word.word;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3383
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3384
val randomPriority = randomWord;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3385
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3386
val comparePriority = Word.compare;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3387
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3388
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3389
(* Priority search trees.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3390
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3391
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3392
datatype 'value tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3393
    E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3394
  | T of 'value node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3395
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3396
and 'value node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3397
    Node of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3398
      {size : int,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3399
       priority : priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3400
       left : 'value tree,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3401
       key : key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3402
       value : 'value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3403
       right : 'value tree};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3404
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3405
fun lowerPriorityNode node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3406
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3407
      val Node {priority = p1, ...} = node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3408
      and Node {priority = p2, ...} = node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3409
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3410
      comparePriority (p1,p2) = LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3411
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3412
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3413
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3414
(* Tree debugging functions.                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3415
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3416
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3417
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3418
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3419
  fun checkSizes tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3420
      case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3421
        E => 0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3422
      | T (Node {size,left,right,...}) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3423
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3424
          val l = checkSizes left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3425
          and r = checkSizes right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3426
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3427
          val () = if l + 1 + r = size then () else raise Bug "wrong size"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3428
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3429
          size
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3430
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3431
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3432
  fun checkSorted x tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3433
      case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3434
        E => x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3435
      | T (Node {left,key,right,...}) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3436
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3437
          val x = checkSorted x left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3438
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3439
          val () =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3440
              case x of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3441
                NONE => ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3442
              | SOME k =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3443
                case compareKey (k,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3444
                  LESS => ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3445
                | EQUAL => raise Bug "duplicate keys"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3446
                | GREATER => raise Bug "unsorted"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3447
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3448
          val x = SOME key
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3449
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3450
          checkSorted x right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3451
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3452
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3453
  fun checkPriorities tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3454
      case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3455
        E => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3456
      | T node =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3457
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3458
          val Node {left,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3459
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3460
          val () =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3461
              case checkPriorities left of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3462
                NONE => ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3463
              | SOME lnode =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3464
                if not (lowerPriorityNode node lnode) then ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3465
                else raise Bug "left child has greater priority"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3466
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3467
          val () =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3468
              case checkPriorities right of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3469
                NONE => ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3470
              | SOME rnode =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3471
                if not (lowerPriorityNode node rnode) then ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3472
                else raise Bug "right child has greater priority"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3473
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3474
          SOME node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3475
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3476
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3477
  fun treeCheckInvariants tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3478
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3479
        val _ = checkSizes tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3480
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3481
        val _ = checkSorted NONE tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3482
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3483
        val _ = checkPriorities tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3484
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3485
        tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3486
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3487
      handle Error err => raise Bug err;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3488
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3489
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3490
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3491
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3492
(* Tree operations.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3493
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3494
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3495
fun treeNew () = E;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3496
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3497
fun nodeSize (Node {size = x, ...}) = x;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3498
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3499
fun treeSize tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3500
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3501
      E => 0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3502
    | T x => nodeSize x;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3503
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3504
fun mkNode priority left key value right =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3505
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3506
      val size = treeSize left + 1 + treeSize right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3507
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3508
      Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3509
        {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3510
         priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3511
         left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3512
         key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3513
         value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3514
         right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3515
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3516
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3517
fun mkTree priority left key value right =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3518
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3519
      val node = mkNode priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3520
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3521
      T node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3522
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3523
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3524
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3525
(* Extracting the left and right spines of a tree.                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3526
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3527
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3528
fun treeLeftSpine acc tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3529
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3530
      E => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3531
    | T node => nodeLeftSpine acc node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3532
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3533
and nodeLeftSpine acc node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3534
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3535
      val Node {left,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3536
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3537
      treeLeftSpine (node :: acc) left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3538
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3539
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3540
fun treeRightSpine acc tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3541
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3542
      E => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3543
    | T node => nodeRightSpine acc node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3544
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3545
and nodeRightSpine acc node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3546
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3547
      val Node {right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3548
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3549
      treeRightSpine (node :: acc) right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3550
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3551
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3552
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3553
(* Singleton trees.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3554
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3555
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3556
fun mkNodeSingleton priority key value =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3557
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3558
      val size = 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3559
      and left = E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3560
      and right = E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3561
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3562
      Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3563
        {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3564
         priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3565
         left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3566
         key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3567
         value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3568
         right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3569
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3570
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3571
fun nodeSingleton (key,value) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3572
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3573
      val priority = randomPriority ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3574
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3575
      mkNodeSingleton priority key value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3576
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3577
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3578
fun treeSingleton key_value =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3579
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3580
      val node = nodeSingleton key_value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3581
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3582
      T node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3583
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3584
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3585
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3586
(* Appending two trees, where every element of the first tree is less than   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3587
(* every element of the second tree.                                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3588
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3589
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3590
fun treeAppend tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3591
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3592
      E => tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3593
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3594
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3595
        E => tree1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3596
      | T node2 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3597
        if lowerPriorityNode node1 node2 then
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3598
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3599
            val Node {priority,left,key,value,right,...} = node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3600
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3601
            val left = treeAppend tree1 left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3602
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3603
            mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3604
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3605
        else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3606
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3607
            val Node {priority,left,key,value,right,...} = node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3608
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3609
            val right = treeAppend right tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3610
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3611
            mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3612
          end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3613
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3614
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3615
(* Appending two trees and a node, where every element of the first tree is  *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3616
(* less than the node, which in turn is less than every element of the       *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3617
(* second tree.                                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3618
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3619
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3620
fun treeCombine left node right =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3621
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3622
      val left_node = treeAppend left (T node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3623
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3624
      treeAppend left_node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3625
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3626
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3627
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3628
(* Searching a tree for a value.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3629
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3630
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3631
fun treePeek pkey tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3632
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3633
      E => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3634
    | T node => nodePeek pkey node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3635
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3636
and nodePeek pkey node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3637
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3638
      val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3639
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3640
      case compareKey (pkey,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3641
        LESS => treePeek pkey left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3642
      | EQUAL => SOME value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3643
      | GREATER => treePeek pkey right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3644
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3645
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3646
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3647
(* Tree paths.                                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3648
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3649
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3650
(* Generating a path by searching a tree for a key/value pair *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3651
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3652
fun treePeekPath pkey path tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3653
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3654
      E => (path,NONE)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3655
    | T node => nodePeekPath pkey path node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3656
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3657
and nodePeekPath pkey path node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3658
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3659
      val Node {left,key,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3660
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3661
      case compareKey (pkey,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3662
        LESS => treePeekPath pkey ((true,node) :: path) left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3663
      | EQUAL => (path, SOME node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3664
      | GREATER => treePeekPath pkey ((false,node) :: path) right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3665
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3666
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3667
(* A path splits a tree into left/right components *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3668
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3669
fun addSidePath ((wentLeft,node),(leftTree,rightTree)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3670
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3671
      val Node {priority,left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3672
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3673
      if wentLeft then (leftTree, mkTree priority rightTree key value right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3674
      else (mkTree priority left key value leftTree, rightTree)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3675
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3676
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3677
fun addSidesPath left_right = List.foldl addSidePath left_right;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3678
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3679
fun mkSidesPath path = addSidesPath (E,E) path;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3680
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3681
(* Updating the subtree at a path *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3682
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3683
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3684
  fun updateTree ((wentLeft,node),tree) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3685
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3686
        val Node {priority,left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3687
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3688
        if wentLeft then mkTree priority tree key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3689
        else mkTree priority left key value tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3690
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3691
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3692
  fun updateTreePath tree = List.foldl updateTree tree;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3693
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3694
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3695
(* Inserting a new node at a path position *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3696
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3697
fun insertNodePath node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3698
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3699
      fun insert left_right path =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3700
          case path of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3701
            [] =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3702
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3703
              val (left,right) = left_right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3704
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3705
              treeCombine left node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3706
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3707
          | (step as (_,snode)) :: rest =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3708
            if lowerPriorityNode snode node then
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3709
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3710
                val left_right = addSidePath (step,left_right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3711
              in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3712
                insert left_right rest
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3713
              end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3714
            else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3715
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3716
                val (left,right) = left_right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3717
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3718
                val tree = treeCombine left node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3719
              in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3720
                updateTreePath tree path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3721
              end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3722
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3723
      insert (E,E)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3724
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3725
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3726
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3727
(* Using a key to split a node into three components: the keys comparing     *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3728
(* less than the supplied key, an optional equal key, and the keys comparing *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3729
(* greater.                                                                  *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3730
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3731
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3732
fun nodePartition pkey node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3733
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3734
      val (path,pnode) = nodePeekPath pkey [] node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3735
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3736
      case pnode of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3737
        NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3738
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3739
          val (left,right) = mkSidesPath path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3740
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3741
          (left,NONE,right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3742
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3743
      | SOME node =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3744
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3745
          val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3746
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3747
          val (left,right) = addSidesPath (left,right) path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3748
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3749
          (left, SOME (key,value), right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3750
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3751
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3752
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3753
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3754
(* Searching a tree for a key/value pair.                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3755
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3756
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3757
fun treePeekKey pkey tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3758
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3759
      E => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3760
    | T node => nodePeekKey pkey node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3761
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3762
and nodePeekKey pkey node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3763
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3764
      val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3765
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3766
      case compareKey (pkey,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3767
        LESS => treePeekKey pkey left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3768
      | EQUAL => SOME (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3769
      | GREATER => treePeekKey pkey right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3770
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3771
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3772
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3773
(* Inserting new key/values into the tree.                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3774
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3775
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3776
fun treeInsert key_value tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3777
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3778
      val (key,value) = key_value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3779
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3780
      val (path,inode) = treePeekPath key [] tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3781
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3782
      case inode of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3783
        NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3784
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3785
          val node = nodeSingleton (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3786
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3787
          insertNodePath node path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3788
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3789
      | SOME node =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3790
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3791
          val Node {size,priority,left,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3792
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3793
          val node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3794
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3795
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3796
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3797
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3798
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3799
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3800
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3801
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3802
          updateTreePath (T node) path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3803
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3804
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3805
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3806
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3807
(* Deleting key/value pairs: it raises an exception if the supplied key is   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3808
(* not present.                                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3809
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3810
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3811
fun treeDelete dkey tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3812
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3813
      E => raise Bug "Metis_KeyMap.delete: element not found"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3814
    | T node => nodeDelete dkey node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3815
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3816
and nodeDelete dkey node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3817
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3818
      val Node {size,priority,left,key,value,right} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3819
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3820
      case compareKey (dkey,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3821
        LESS =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3822
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3823
          val size = size - 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3824
          and left = treeDelete dkey left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3825
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3826
          val node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3827
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3828
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3829
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3830
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3831
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3832
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3833
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3834
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3835
          T node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3836
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3837
      | EQUAL => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3838
      | GREATER =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3839
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3840
          val size = size - 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3841
          and right = treeDelete dkey right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3842
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3843
          val node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3844
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3845
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3846
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3847
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3848
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3849
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3850
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3851
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3852
          T node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3853
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3854
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3855
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3856
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3857
(* Partial map is the basic operation for preserving tree structure.         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3858
(* It applies its argument function to the elements *in order*.              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3859
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3860
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3861
fun treeMapPartial f tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3862
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3863
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3864
    | T node => nodeMapPartial f node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3865
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3866
and nodeMapPartial f (Node {priority,left,key,value,right,...}) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3867
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3868
      val left = treeMapPartial f left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3869
      and vo = f (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3870
      and right = treeMapPartial f right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3871
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3872
      case vo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3873
        NONE => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3874
      | SOME value => mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3875
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3876
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3877
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3878
(* Mapping tree values.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3879
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3880
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3881
fun treeMap f tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3882
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3883
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3884
    | T node => T (nodeMap f node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3885
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3886
and nodeMap f node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3887
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3888
      val Node {size,priority,left,key,value,right} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3889
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3890
      val left = treeMap f left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3891
      and value = f (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3892
      and right = treeMap f right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3893
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3894
      Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3895
        {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3896
         priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3897
         left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3898
         key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3899
         value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3900
         right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3901
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3902
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3903
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3904
(* Merge is the basic operation for joining two trees. Note that the merged  *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3905
(* key is always the one from the second map.                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3906
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3907
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3908
fun treeMerge f1 f2 fb tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3909
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3910
      E => treeMapPartial f2 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3911
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3912
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3913
        E => treeMapPartial f1 tree1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3914
      | T node2 => nodeMerge f1 f2 fb node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3915
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3916
and nodeMerge f1 f2 fb node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3917
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3918
      val Node {priority,left,key,value,right,...} = node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3919
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3920
      val (l,kvo,r) = nodePartition key node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3921
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3922
      val left = treeMerge f1 f2 fb l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3923
      and right = treeMerge f1 f2 fb r right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3924
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3925
      val vo =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3926
          case kvo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3927
            NONE => f2 (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3928
          | SOME kv => fb (kv,(key,value))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3929
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3930
      case vo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3931
        NONE => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3932
      | SOME value =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3933
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3934
          val node = mkNodeSingleton priority key value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3935
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3936
          treeCombine left node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3937
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3938
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3939
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3940
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3941
(* A union operation on trees.                                               *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3942
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3943
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3944
fun treeUnion f f2 tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3945
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3946
      E => tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3947
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3948
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3949
        E => tree1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3950
      | T node2 => nodeUnion f f2 node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3951
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3952
and nodeUnion f f2 node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3953
    if pointerEqual (node1,node2) then nodeMapPartial f2 node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3954
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3955
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3956
        val Node {priority,left,key,value,right,...} = node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3957
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3958
        val (l,kvo,r) = nodePartition key node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3959
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3960
        val left = treeUnion f f2 l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3961
        and right = treeUnion f f2 r right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3962
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3963
        val vo =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3964
            case kvo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3965
              NONE => SOME value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3966
            | SOME kv => f (kv,(key,value))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3967
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3968
        case vo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3969
          NONE => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3970
        | SOME value =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3971
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3972
            val node = mkNodeSingleton priority key value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3973
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3974
            treeCombine left node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3975
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3976
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3977
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3978
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3979
(* An intersect operation on trees.                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3980
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3981
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3982
fun treeIntersect f t1 t2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3983
    case t1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3984
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3985
    | T n1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3986
      case t2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3987
        E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3988
      | T n2 => nodeIntersect f n1 n2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3989
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3990
and nodeIntersect f n1 n2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3991
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3992
      val Node {priority,left,key,value,right,...} = n2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3993
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3994
      val (l,kvo,r) = nodePartition key n1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3995
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3996
      val left = treeIntersect f l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3997
      and right = treeIntersect f r right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3998
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3999
      val vo =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4000
          case kvo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4001
            NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4002
          | SOME kv => f (kv,(key,value))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4003
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4004
      case vo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4005
        NONE => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4006
      | SOME value => mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4007
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4008
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4009
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4010
(* A union operation on trees which simply chooses the second value.         *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4011
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4012
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4013
fun treeUnionDomain tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4014
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4015
      E => tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4016
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4017
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4018
        E => tree1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4019
      | T node2 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4020
        if pointerEqual (node1,node2) then tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4021
        else nodeUnionDomain node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4022
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4023
and nodeUnionDomain node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4024
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4025
      val Node {priority,left,key,value,right,...} = node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4026
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4027
      val (l,_,r) = nodePartition key node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4028
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4029
      val left = treeUnionDomain l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4030
      and right = treeUnionDomain r right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4031
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4032
      val node = mkNodeSingleton priority key value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4033
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4034
      treeCombine left node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4035
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4036
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4037
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4038
(* An intersect operation on trees which simply chooses the second value.    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4039
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4040
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4041
fun treeIntersectDomain tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4042
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4043
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4044
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4045
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4046
        E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4047
      | T node2 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4048
        if pointerEqual (node1,node2) then tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4049
        else nodeIntersectDomain node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4050
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4051
and nodeIntersectDomain node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4052
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4053
      val Node {priority,left,key,value,right,...} = node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4054
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4055
      val (l,kvo,r) = nodePartition key node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4056
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4057
      val left = treeIntersectDomain l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4058
      and right = treeIntersectDomain r right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4059
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4060
      if Option.isSome kvo then mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4061
      else treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4062
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4063
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4064
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4065
(* A difference operation on trees.                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4066
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4067
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4068
fun treeDifferenceDomain t1 t2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4069
    case t1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4070
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4071
    | T n1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4072
      case t2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4073
        E => t1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4074
      | T n2 => nodeDifferenceDomain n1 n2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4075
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4076
and nodeDifferenceDomain n1 n2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4077
    if pointerEqual (n1,n2) then E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4078
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4079
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4080
        val Node {priority,left,key,value,right,...} = n1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4081
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4082
        val (l,kvo,r) = nodePartition key n2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4083
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4084
        val left = treeDifferenceDomain left l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4085
        and right = treeDifferenceDomain right r
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4086
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4087
        if Option.isSome kvo then treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4088
        else mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4089
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4090
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4091
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4092
(* A subset operation on trees.                                              *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4093
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4094
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4095
fun treeSubsetDomain tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4096
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4097
      E => true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4098
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4099
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4100
        E => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4101
      | T node2 => nodeSubsetDomain node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4102
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4103
and nodeSubsetDomain node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4104
    pointerEqual (node1,node2) orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4105
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4106
      val Node {size,left,key,right,...} = node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4107
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4108
      size <= nodeSize node2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4109
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4110
        val (l,kvo,r) = nodePartition key node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4111
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4112
        Option.isSome kvo andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4113
        treeSubsetDomain left l andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4114
        treeSubsetDomain right r
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4115
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4116
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4117
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4118
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4119
(* Picking an arbitrary key/value pair from a tree.                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4120
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4121
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4122
fun nodePick node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4123
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4124
      val Node {key,value,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4125
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4126
      (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4127
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4128
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4129
fun treePick tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4130
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4131
      E => raise Bug "Metis_KeyMap.treePick"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4132
    | T node => nodePick node;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4133
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4134
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4135
(* Removing an arbitrary key/value pair from a tree.                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4136
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4137
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4138
fun nodeDeletePick node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4139
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4140
      val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4141
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4142
      ((key,value), treeAppend left right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4143
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4144
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4145
fun treeDeletePick tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4146
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4147
      E => raise Bug "Metis_KeyMap.treeDeletePick"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4148
    | T node => nodeDeletePick node;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4149
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4150
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4151
(* Finding the nth smallest key/value (counting from 0).                     *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4152
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4153
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4154
fun treeNth n tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4155
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4156
      E => raise Bug "Metis_KeyMap.treeNth"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4157
    | T node => nodeNth n node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4158
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4159
and nodeNth n node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4160
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4161
      val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4162
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4163
      val k = treeSize left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4164
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4165
      if n = k then (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4166
      else if n < k then treeNth n left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4167
      else treeNth (n - (k + 1)) right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4168
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4169
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4170
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4171
(* Removing the nth smallest key/value (counting from 0).                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4172
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4173
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4174
fun treeDeleteNth n tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4175
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4176
      E => raise Bug "Metis_KeyMap.treeDeleteNth"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4177
    | T node => nodeDeleteNth n node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4178
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4179
and nodeDeleteNth n node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4180
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4181
      val Node {size,priority,left,key,value,right} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4182
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4183
      val k = treeSize left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4184
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4185
      if n = k then ((key,value), treeAppend left right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4186
      else if n < k then
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4187
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4188
          val (key_value,left) = treeDeleteNth n left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4189
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4190
          val size = size - 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4191
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4192
          val node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4193
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4194
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4195
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4196
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4197
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4198
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4199
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4200
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4201
          (key_value, T node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4202
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4203
      else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4204
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4205
          val n = n - (k + 1)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4206
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4207
          val (key_value,right) = treeDeleteNth n right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4208
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4209
          val size = size - 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4210
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4211
          val node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4212
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4213
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4214
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4215
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4216
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4217
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4218
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4219
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4220
          (key_value, T node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4221
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4222
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4223
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4224
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4225
(* Iterators.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4226
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4227
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4228
datatype 'value iterator =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4229
    LeftToRightIterator of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4230
      (key * 'value) * 'value tree * 'value node list
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4231
  | RightToLeftIterator of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4232
      (key * 'value) * 'value tree * 'value node list;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4233
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4234
fun fromSpineLeftToRightIterator nodes =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4235
    case nodes of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4236
      [] => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4237
    | Node {key,value,right,...} :: nodes =>
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4238
      SOME (LeftToRightIterator ((key,value),right,nodes));
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4239
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4240
fun fromSpineRightToLeftIterator nodes =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4241
    case nodes of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4242
      [] => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4243
    | Node {key,value,left,...} :: nodes =>
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4244
      SOME (RightToLeftIterator ((key,value),left,nodes));
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4245
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4246
fun addLeftToRightIterator nodes tree = fromSpineLeftToRightIterator (treeLeftSpine nodes tree);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4247
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4248
fun addRightToLeftIterator nodes tree = fromSpineRightToLeftIterator (treeRightSpine nodes tree);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4249
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4250
fun treeMkIterator tree = addLeftToRightIterator [] tree;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4251
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4252
fun treeMkRevIterator tree = addRightToLeftIterator [] tree;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4253
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4254
fun readIterator iter =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4255
    case iter of
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4256
      LeftToRightIterator (key_value,_,_) => key_value
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4257
    | RightToLeftIterator (key_value,_,_) => key_value;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4258
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4259
fun advanceIterator iter =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4260
    case iter of
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4261
      LeftToRightIterator (_,tree,nodes) => addLeftToRightIterator nodes tree
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4262
    | RightToLeftIterator (_,tree,nodes) => addRightToLeftIterator nodes tree;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4263
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4264
fun foldIterator f acc io =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4265
    case io of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4266
      NONE => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4267
    | SOME iter =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4268
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4269
        val (key,value) = readIterator iter
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4270
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4271
        foldIterator f (f (key,value,acc)) (advanceIterator iter)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4272
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4273
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4274
fun findIterator pred io =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4275
    case io of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4276
      NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4277
    | SOME iter =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4278
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4279
        val key_value = readIterator iter
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4280
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4281
        if pred key_value then SOME key_value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4282
        else findIterator pred (advanceIterator iter)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4283
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4284
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4285
fun firstIterator f io =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4286
    case io of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4287
      NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4288
    | SOME iter =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4289
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4290
        val key_value = readIterator iter
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4291
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4292
        case f key_value of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4293
          NONE => firstIterator f (advanceIterator iter)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4294
        | s => s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4295
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4296
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4297
fun compareIterator compareValue io1 io2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4298
    case (io1,io2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4299
      (NONE,NONE) => EQUAL
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4300
    | (NONE, SOME _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4301
    | (SOME _, NONE) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4302
    | (SOME i1, SOME i2) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4303
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4304
        val (k1,v1) = readIterator i1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4305
        and (k2,v2) = readIterator i2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4306
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4307
        case compareKey (k1,k2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4308
          LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4309
        | EQUAL =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4310
          (case compareValue (v1,v2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4311
             LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4312
           | EQUAL =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4313
             let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4314
               val io1 = advanceIterator i1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4315
               and io2 = advanceIterator i2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4316
             in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4317
               compareIterator compareValue io1 io2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4318
             end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4319
           | GREATER => GREATER)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4320
        | GREATER => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4321
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4322
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4323
fun equalIterator equalValue io1 io2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4324
    case (io1,io2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4325
      (NONE,NONE) => true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4326
    | (NONE, SOME _) => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4327
    | (SOME _, NONE) => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4328
    | (SOME i1, SOME i2) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4329
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4330
        val (k1,v1) = readIterator i1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4331
        and (k2,v2) = readIterator i2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4332
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4333
        equalKey k1 k2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4334
        equalValue v1 v2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4335
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4336
          val io1 = advanceIterator i1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4337
          and io2 = advanceIterator i2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4338
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4339
          equalIterator equalValue io1 io2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4340
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4341
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4342
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4343
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4344
(* A type of finite maps.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4345
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4346
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4347
datatype 'value map =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4348
    Metis_Map of 'value tree;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4349
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4350
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4351
(* Metis_Map debugging functions.                                                  *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4352
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4353
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4354
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4355
fun checkInvariants s m =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4356
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4357
      val Metis_Map tree = m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4358
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4359
      val _ = treeCheckInvariants tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4360
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4361
      m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4362
    end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4363
    handle Bug bug => raise Bug (s ^ "\n" ^ "Metis_KeyMap.checkInvariants: " ^ bug);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4364
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4365
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4366
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4367
(* Constructors.                                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4368
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4369
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4370
fun new () =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4371
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4372
      val tree = treeNew ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4373
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4374
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4375
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4376
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4377
fun singleton key_value =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4378
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4379
      val tree = treeSingleton key_value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4380
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4381
      Metis_Map tree
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4382
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4383
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4384
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4385
(* Metis_Map size.                                                                 *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4386
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4387
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4388
fun size (Metis_Map tree) = treeSize tree;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4389
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4390
fun null m = size m = 0;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4391
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4392
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4393
(* Querying.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4394
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4395
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4396
fun peekKey (Metis_Map tree) key = treePeekKey key tree;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4397
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4398
fun peek (Metis_Map tree) key = treePeek key tree;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4399
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4400
fun inDomain key m = Option.isSome (peek m key);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4401
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4402
fun get m key =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4403
    case peek m key of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4404
      NONE => raise Error "Metis_KeyMap.get: element not found"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4405
    | SOME value => value;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4406
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4407
fun pick (Metis_Map tree) = treePick tree;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4408
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4409
fun nth (Metis_Map tree) n = treeNth n tree;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4410
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4411
fun random m =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4412
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4413
      val n = size m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4414
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4415
      if n = 0 then raise Bug "Metis_KeyMap.random: empty"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4416
      else nth m (randomInt n)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4417
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4418
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4419
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4420
(* Adding.                                                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4421
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4422
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4423
fun insert (Metis_Map tree) key_value =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4424
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4425
      val tree = treeInsert key_value tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4426
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4427
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4428
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4429
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4430
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4431
val insert = fn m => fn kv =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4432
    checkInvariants "Metis_KeyMap.insert: result"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4433
      (insert (checkInvariants "Metis_KeyMap.insert: input" m) kv);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4434
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4435
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4436
fun insertList m =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4437
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4438
      fun ins (key_value,acc) = insert acc key_value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4439
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4440
      List.foldl ins m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4441
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4442
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4443
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4444
(* Removing.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4445
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4446
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4447
fun delete (Metis_Map tree) dkey =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4448
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4449
      val tree = treeDelete dkey tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4450
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4451
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4452
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4453
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4454
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4455
val delete = fn m => fn k =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4456
    checkInvariants "Metis_KeyMap.delete: result"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4457
      (delete (checkInvariants "Metis_KeyMap.delete: input" m) k);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4458
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4459
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4460
fun remove m key = if inDomain key m then delete m key else m;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4461
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4462
fun deletePick (Metis_Map tree) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4463
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4464
      val (key_value,tree) = treeDeletePick tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4465
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4466
      (key_value, Metis_Map tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4467
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4468
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4469
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4470
val deletePick = fn m =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4471
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4472
      val (kv,m) = deletePick (checkInvariants "Metis_KeyMap.deletePick: input" m)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4473
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4474
      (kv, checkInvariants "Metis_KeyMap.deletePick: result" m)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4475
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4476
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4477
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4478
fun deleteNth (Metis_Map tree) n =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4479
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4480
      val (key_value,tree) = treeDeleteNth n tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4481
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4482
      (key_value, Metis_Map tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4483
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4484
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4485
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4486
val deleteNth = fn m => fn n =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4487
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4488
      val (kv,m) = deleteNth (checkInvariants "Metis_KeyMap.deleteNth: input" m) n
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4489
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4490
      (kv, checkInvariants "Metis_KeyMap.deleteNth: result" m)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4491
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4492
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4493
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4494
fun deleteRandom m =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4495
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4496
      val n = size m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4497
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4498
      if n = 0 then raise Bug "Metis_KeyMap.deleteRandom: empty"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4499
      else deleteNth m (randomInt n)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4500
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4501
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4502
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4503
(* Joining (all join operations prefer keys in the second map).              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4504
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4505
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4506
fun merge {first,second,both} (Metis_Map tree1) (Metis_Map tree2) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4507
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4508
      val tree = treeMerge first second both tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4509
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4510
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4511
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4512
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4513
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4514
val merge = fn f => fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4515
    checkInvariants "Metis_KeyMap.merge: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4516
      (merge f
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4517
         (checkInvariants "Metis_KeyMap.merge: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4518
         (checkInvariants "Metis_KeyMap.merge: input 2" m2));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4519
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4520
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4521
fun union f (Metis_Map tree1) (Metis_Map tree2) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4522
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4523
      fun f2 kv = f (kv,kv)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4524
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4525
      val tree = treeUnion f f2 tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4526
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4527
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4528
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4529
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4530
(*BasicDebug
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4531
val union = fn f => fn m1 => fn m2 =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4532
    checkInvariants "Metis_KeyMap.union: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4533
      (union f
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4534
         (checkInvariants "Metis_KeyMap.union: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4535
         (checkInvariants "Metis_KeyMap.union: input 2" m2));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4536
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4537
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4538
fun intersect f (Metis_Map tree1) (Metis_Map tree2) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4539
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4540
      val tree = treeIntersect f tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4541
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4542
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4543
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4544
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4545
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4546
val intersect = fn f => fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4547
    checkInvariants "Metis_KeyMap.intersect: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4548
      (intersect f
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4549
         (checkInvariants "Metis_KeyMap.intersect: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4550
         (checkInvariants "Metis_KeyMap.intersect: input 2" m2));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4551
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4552
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4553
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4554
(* Iterators over maps.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4555
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4556
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4557
fun mkIterator (Metis_Map tree) = treeMkIterator tree;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4558
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4559
fun mkRevIterator (Metis_Map tree) = treeMkRevIterator tree;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4560
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4561
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4562
(* Mapping and folding.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4563
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4564
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4565
fun mapPartial f (Metis_Map tree) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4566
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4567
      val tree = treeMapPartial f tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4568
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4569
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4570
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4571
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4572
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4573
val mapPartial = fn f => fn m =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4574
    checkInvariants "Metis_KeyMap.mapPartial: result"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4575
      (mapPartial f (checkInvariants "Metis_KeyMap.mapPartial: input" m));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4576
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4577
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4578
fun map f (Metis_Map tree) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4579
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4580
      val tree = treeMap f tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4581
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4582
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4583
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4584
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4585
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4586
val map = fn f => fn m =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4587
    checkInvariants "Metis_KeyMap.map: result"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4588
      (map f (checkInvariants "Metis_KeyMap.map: input" m));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4589
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4590
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4591
fun transform f = map (fn (_,value) => f value);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4592
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4593
fun filter pred =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4594
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4595
      fun f (key_value as (_,value)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4596
          if pred key_value then SOME value else NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4597
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4598
      mapPartial f
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4599
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4600
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4601
fun partition p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4602
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4603
      fun np x = not (p x)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4604
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4605
      fn m => (filter p m, filter np m)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4606
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4607
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4608
fun foldl f b m = foldIterator f b (mkIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4609
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4610
fun foldr f b m = foldIterator f b (mkRevIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4611
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4612
fun app f m = foldl (fn (key,value,()) => f (key,value)) () m;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4613
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4614
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4615
(* Searching.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4616
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4617
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4618
fun findl p m = findIterator p (mkIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4619
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4620
fun findr p m = findIterator p (mkRevIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4621
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4622
fun firstl f m = firstIterator f (mkIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4623
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4624
fun firstr f m = firstIterator f (mkRevIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4625
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4626
fun exists p m = Option.isSome (findl p m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4627
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4628
fun all p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4629
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4630
      fun np x = not (p x)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4631
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4632
      fn m => not (exists np m)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4633
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4634
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4635
fun count pred =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4636
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4637
      fun f (k,v,acc) = if pred (k,v) then acc + 1 else acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4638
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4639
      foldl f 0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4640
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4641
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4642
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4643
(* Comparing.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4644
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4645
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4646
fun compare compareValue (m1,m2) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4647
    if pointerEqual (m1,m2) then EQUAL
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4648
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4649
      case Int.compare (size m1, size m2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4650
        LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4651
      | EQUAL =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4652
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4653
          val Metis_Map _ = m1
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4654
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4655
          val io1 = mkIterator m1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4656
          and io2 = mkIterator m2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4657
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4658
          compareIterator compareValue io1 io2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4659
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4660
      | GREATER => GREATER;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4661
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4662
fun equal equalValue m1 m2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4663
    pointerEqual (m1,m2) orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4664
    (size m1 = size m2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4665
     let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4666
       val Metis_Map _ = m1
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4667
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4668
       val io1 = mkIterator m1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4669
       and io2 = mkIterator m2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4670
     in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4671
       equalIterator equalValue io1 io2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4672
     end);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4673
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4674
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4675
(* Metis_Set operations on the domain.                                             *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4676
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4677
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4678
fun unionDomain (Metis_Map tree1) (Metis_Map tree2) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4679
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4680
      val tree = treeUnionDomain tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4681
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4682
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4683
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4684
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4685
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4686
val unionDomain = fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4687
    checkInvariants "Metis_KeyMap.unionDomain: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4688
      (unionDomain
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4689
         (checkInvariants "Metis_KeyMap.unionDomain: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4690
         (checkInvariants "Metis_KeyMap.unionDomain: input 2" m2));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4691
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4692
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4693
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4694
  fun uncurriedUnionDomain (m,acc) = unionDomain acc m;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4695
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4696
  fun unionListDomain ms =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4697
      case ms of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4698
        [] => raise Bug "Metis_KeyMap.unionListDomain: no sets"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4699
      | m :: ms => List.foldl uncurriedUnionDomain m ms;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4700
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4701
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4702
fun intersectDomain (Metis_Map tree1) (Metis_Map tree2) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4703
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4704
      val tree = treeIntersectDomain tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4705
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4706
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4707
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4708
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4709
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4710
val intersectDomain = fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4711
    checkInvariants "Metis_KeyMap.intersectDomain: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4712
      (intersectDomain
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4713
         (checkInvariants "Metis_KeyMap.intersectDomain: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4714
         (checkInvariants "Metis_KeyMap.intersectDomain: input 2" m2));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4715
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4716
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4717
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4718
  fun uncurriedIntersectDomain (m,acc) = intersectDomain acc m;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4719
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4720
  fun intersectListDomain ms =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4721
      case ms of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4722
        [] => raise Bug "Metis_KeyMap.intersectListDomain: no sets"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4723
      | m :: ms => List.foldl uncurriedIntersectDomain m ms;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4724
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4725
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4726
fun differenceDomain (Metis_Map tree1) (Metis_Map tree2) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4727
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4728
      val tree = treeDifferenceDomain tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4729
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4730
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4731
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4732
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4733
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4734
val differenceDomain = fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4735
    checkInvariants "Metis_KeyMap.differenceDomain: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4736
      (differenceDomain
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4737
         (checkInvariants "Metis_KeyMap.differenceDomain: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4738
         (checkInvariants "Metis_KeyMap.differenceDomain: input 2" m2));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4739
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4740
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4741
fun symmetricDifferenceDomain m1 m2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4742
    unionDomain (differenceDomain m1 m2) (differenceDomain m2 m1);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4743
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4744
fun equalDomain m1 m2 = equal (K (K true)) m1 m2;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4745
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4746
fun subsetDomain (Metis_Map tree1) (Metis_Map tree2) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4747
    treeSubsetDomain tree1 tree2;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4748
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4749
fun disjointDomain m1 m2 = null (intersectDomain m1 m2);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4750
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4751
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4752
(* Converting to and from lists.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4753
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4754
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4755
fun keys m = foldr (fn (key,_,l) => key :: l) [] m;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4756
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4757
fun values m = foldr (fn (_,value,l) => value :: l) [] m;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4758
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4759
fun toList m = foldr (fn (key,value,l) => (key,value) :: l) [] m;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4760
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4761
fun fromList l =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4762
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4763
      val m = new ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4764
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4765
      insertList m l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4766
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4767
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4768
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4769
(* Pretty-printing.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4770
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4771
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4772
fun toString m = "<" ^ (if null m then "" else Int.toString (size m)) ^ ">";
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4773
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4774
end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4775
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4776
structure Metis_IntMap =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4777
Metis_KeyMap (Metis_IntOrdered);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4778
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4779
structure Metis_IntPairMap =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4780
Metis_KeyMap (Metis_IntPairOrdered);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4781
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4782
structure Metis_StringMap =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4783
Metis_KeyMap (Metis_StringOrdered);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4784
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4785
(**** Original file: src/Set.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4786
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4787
(* ========================================================================= *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4788
(* FINITE SETS IMPLEMENTED WITH RANDOMLY BALANCED TREES                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4789
(* Copyright (c) 2004 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4790
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4791
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4792
signature Metis_Set =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4793
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4794
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4795
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4796
(* A type of finite sets.                                                    *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4797
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4798
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4799
type 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4800
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4801
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4802
(* Constructors.                                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4803
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4804
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4805
val empty : ('elt * 'elt -> order) -> 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4806
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4807
val singleton : ('elt * 'elt -> order) -> 'elt -> 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4808
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4809
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4810
(* Metis_Set size.                                                                 *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4811
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4812
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4813
val null : 'elt set -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4814
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4815
val size : 'elt set -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4816
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4817
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4818
(* Querying.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4819
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4820
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4821
val peek : 'elt set -> 'elt -> 'elt option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4822
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4823
val member : 'elt -> 'elt set -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4824
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4825
val pick : 'elt set -> 'elt  (* an arbitrary element *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4826
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4827
val nth : 'elt set -> int -> 'elt  (* in the range [0,size-1] *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4828
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4829
val random : 'elt set -> 'elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4830
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4831
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4832
(* Adding.                                                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4833
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4834
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4835
val add : 'elt set -> 'elt -> 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4836
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4837
val addList : 'elt set -> 'elt list -> 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4838
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4839
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4840
(* Removing.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4841
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4842
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4843
val delete : 'elt set -> 'elt -> 'elt set  (* must be present *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4844
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4845
val remove : 'elt set -> 'elt -> 'elt set
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4846
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4847
val deletePick : 'elt set -> 'elt * 'elt set
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4848
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4849
val deleteNth : 'elt set -> int -> 'elt * 'elt set
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4850
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4851
val deleteRandom : 'elt set -> 'elt * 'elt set
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4852
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4853
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4854
(* Joining.                                                                  *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4855
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4856
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4857
val union : 'elt set -> 'elt set -> 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4858
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4859
val unionList : 'elt set list -> 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4860
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4861
val intersect : 'elt set -> 'elt set -> 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4862
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4863
val intersectList : 'elt set list -> 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4864
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4865
val difference : 'elt set -> 'elt set -> 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4866
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4867
val symmetricDifference : 'elt set -> 'elt set -> 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4868
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4869
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4870
(* Mapping and folding.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4871
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4872
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4873
val filter : ('elt -> bool) -> 'elt set -> 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4874
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4875
val partition : ('elt -> bool) -> 'elt set -> 'elt set * 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4876
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4877
val app : ('elt -> unit) -> 'elt set -> unit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4878
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4879
val foldl : ('elt * 's -> 's) -> 's -> 'elt set -> 's
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4880
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4881
val foldr : ('elt * 's -> 's) -> 's -> 'elt set -> 's
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4882
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4883
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4884
(* Searching.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4885
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4886
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4887
val findl : ('elt -> bool) -> 'elt set -> 'elt option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4888
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4889
val findr : ('elt -> bool) -> 'elt set -> 'elt option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4890
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4891
val firstl : ('elt -> 'a option) -> 'elt set -> 'a option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4892
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4893
val firstr : ('elt -> 'a option) -> 'elt set -> 'a option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4894
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4895
val exists : ('elt -> bool) -> 'elt set -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4896
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4897
val all : ('elt -> bool) -> 'elt set -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4898
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4899
val count : ('elt -> bool) -> 'elt set -> int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4900
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4901
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4902
(* Comparing.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4903
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4904
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4905
val compare : 'elt set * 'elt set -> order
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4906
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4907
val equal : 'elt set -> 'elt set -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4908
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4909
val subset : 'elt set -> 'elt set -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4910
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4911
val disjoint : 'elt set -> 'elt set -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4912
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4913
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4914
(* Converting to and from lists.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4915
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4916
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4917
val transform : ('elt -> 'a) -> 'elt set -> 'a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4918
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4919
val toList : 'elt set -> 'elt list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4920
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4921
val fromList : ('elt * 'elt -> order) -> 'elt list -> 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4922
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4923
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4924
(* Converting to and from maps.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4925
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4926
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4927
type ('elt,'a) map = ('elt,'a) Metis_Map.map
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4928
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4929
val mapPartial : ('elt -> 'a option) -> 'elt set -> ('elt,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4930
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4931
val map : ('elt -> 'a) -> 'elt set -> ('elt,'a) map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4932
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4933
val domain : ('elt,'a) map -> 'elt set
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4934
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4935
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4936
(* Pretty-printing.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4937
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4938
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4939
val toString : 'elt set -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4940
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4941
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4942
(* Iterators over sets                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4943
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4944
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4945
type 'elt iterator
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4946
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4947
val mkIterator : 'elt set -> 'elt iterator option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4948
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4949
val mkRevIterator : 'elt set -> 'elt iterator option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4950
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4951
val readIterator : 'elt iterator -> 'elt
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4952
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4953
val advanceIterator : 'elt iterator -> 'elt iterator option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4954
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4955
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4956
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4957
(**** Original file: src/Set.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4958
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4959
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4960
(* FINITE SETS IMPLEMENTED WITH RANDOMLY BALANCED TREES                      *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4961
(* Copyright (c) 2004 Joe Hurd, distributed under the BSD License            *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4962
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4963
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4964
structure Metis_Set :> Metis_Set =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4965
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4966
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4967
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4968
(* A type of finite sets.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4969
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4970
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4971
type ('elt,'a) map = ('elt,'a) Metis_Map.map;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4972
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4973
datatype 'elt set = Metis_Set of ('elt,unit) map;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4974
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4975
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4976
(* Converting to and from maps.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4977
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4978
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4979
fun dest (Metis_Set m) = m;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4980
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4981
fun mapPartial f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4982
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4983
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4984
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4985
      fn Metis_Set m => Metis_Map.mapPartial mf m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4986
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4987
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4988
fun map f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4989
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4990
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4991
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4992
      fn Metis_Set m => Metis_Map.map mf m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4993
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4994
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4995
fun domain m = Metis_Set (Metis_Map.transform (fn _ => ()) m);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4996
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4997
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4998
(* Constructors.                                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4999
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5000
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5001
fun empty cmp = Metis_Set (Metis_Map.new cmp);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5002
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5003
fun singleton cmp elt = Metis_Set (Metis_Map.singleton cmp (elt,()));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5004
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5005
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5006
(* Metis_Set size.                                                                 *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5007
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5008
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5009
fun null (Metis_Set m) = Metis_Map.null m;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5010
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5011
fun size (Metis_Set m) = Metis_Map.size m;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5012
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5013
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5014
(* Querying.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5015
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5016
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5017
fun peek (Metis_Set m) elt =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5018
    case Metis_Map.peekKey m elt of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5019
      SOME (elt,()) => SOME elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5020
    | NONE => NONE;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5021
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5022
fun member elt (Metis_Set m) = Metis_Map.inDomain elt m;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5023
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5024
fun pick (Metis_Set m) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5025
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5026
      val (elt,_) = Metis_Map.pick m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5027
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5028
      elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5029
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5030
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5031
fun nth (Metis_Set m) n =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5032
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5033
      val (elt,_) = Metis_Map.nth m n
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5034
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5035
      elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5036
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5037
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5038
fun random (Metis_Set m) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5039
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5040
      val (elt,_) = Metis_Map.random m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5041
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5042
      elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5043
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5044
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5045
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5046
(* Adding.                                                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5047
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5048
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5049
fun add (Metis_Set m) elt =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5050
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5051
      val m = Metis_Map.insert m (elt,())
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5052
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5053
      Metis_Set m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5054
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5055
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5056
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5057
  fun uncurriedAdd (elt,set) = add set elt;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5058
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5059
  fun addList set = List.foldl uncurriedAdd set;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5060
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5061
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5062
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5063
(* Removing.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5064
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5065
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5066
fun delete (Metis_Set m) elt =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5067
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5068
      val m = Metis_Map.delete m elt
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5069
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5070
      Metis_Set m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5071
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5072
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5073
fun remove (Metis_Set m) elt =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5074
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5075
      val m = Metis_Map.remove m elt
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5076
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5077
      Metis_Set m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5078
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5079
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5080
fun deletePick (Metis_Set m) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5081
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5082
      val ((elt,()),m) = Metis_Map.deletePick m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5083
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5084
      (elt, Metis_Set m)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5085
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5086
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5087
fun deleteNth (Metis_Set m) n =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5088
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5089
      val ((elt,()),m) = Metis_Map.deleteNth m n
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5090
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5091
      (elt, Metis_Set m)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5092
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5093
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5094
fun deleteRandom (Metis_Set m) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5095
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5096
      val ((elt,()),m) = Metis_Map.deleteRandom m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5097
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5098
      (elt, Metis_Set m)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5099
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5100
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5101
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5102
(* Joining.                                                                  *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5103
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5104
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5105
fun union (Metis_Set m1) (Metis_Set m2) = Metis_Set (Metis_Map.unionDomain m1 m2);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5106
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5107
fun unionList sets =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5108
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5109
      val ms = List.map dest sets
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5110
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5111
      Metis_Set (Metis_Map.unionListDomain ms)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5112
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5113
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5114
fun intersect (Metis_Set m1) (Metis_Set m2) = Metis_Set (Metis_Map.intersectDomain m1 m2);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5115
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5116
fun intersectList sets =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5117
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5118
      val ms = List.map dest sets
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5119
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5120
      Metis_Set (Metis_Map.intersectListDomain ms)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5121
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5122
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5123
fun difference (Metis_Set m1) (Metis_Set m2) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5124
    Metis_Set (Metis_Map.differenceDomain m1 m2);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5125
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5126
fun symmetricDifference (Metis_Set m1) (Metis_Set m2) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5127
    Metis_Set (Metis_Map.symmetricDifferenceDomain m1 m2);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5128
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5129
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5130
(* Mapping and folding.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5131
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5132
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5133
fun filter pred =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5134
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5135
      fun mpred (elt,()) = pred elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5136
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5137
      fn Metis_Set m => Metis_Set (Metis_Map.filter mpred m)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5138
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5139
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5140
fun partition pred =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5141
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5142
      fun mpred (elt,()) = pred elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5143
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5144
      fn Metis_Set m =>
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5145
         let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5146
           val (m1,m2) = Metis_Map.partition mpred m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5147
         in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5148
           (Metis_Set m1, Metis_Set m2)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5149
         end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5150
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5151
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5152
fun app f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5153
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5154
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5155
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5156
      fn Metis_Set m => Metis_Map.app mf m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5157
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5158
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5159
fun foldl f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5160
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5161
      fun mf (elt,(),acc) = f (elt,acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5162
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5163
      fn acc => fn Metis_Set m => Metis_Map.foldl mf acc m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5164
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5165
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5166
fun foldr f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5167
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5168
      fun mf (elt,(),acc) = f (elt,acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5169
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5170
      fn acc => fn Metis_Set m => Metis_Map.foldr mf acc m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5171
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5172
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5173
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5174
(* Searching.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5175
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5176
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5177
fun findl p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5178
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5179
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5180
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5181
      fn Metis_Set m =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5182
         case Metis_Map.findl mp m of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5183
           SOME (elt,()) => SOME elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5184
         | NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5185
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5186
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5187
fun findr p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5188
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5189
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5190
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5191
      fn Metis_Set m =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5192
         case Metis_Map.findr mp m of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5193
           SOME (elt,()) => SOME elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5194
         | NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5195
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5196
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5197
fun firstl f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5198
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5199
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5200
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5201
      fn Metis_Set m => Metis_Map.firstl mf m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5202
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5203
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5204
fun firstr f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5205
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5206
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5207
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5208
      fn Metis_Set m => Metis_Map.firstr mf m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5209
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5210
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5211
fun exists p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5212
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5213
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5214
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5215
      fn Metis_Set m => Metis_Map.exists mp m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5216
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5217
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5218
fun all p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5219
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5220
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5221
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5222
      fn Metis_Set m => Metis_Map.all mp m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5223
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5224
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5225
fun count p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5226
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5227
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5228
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5229
      fn Metis_Set m => Metis_Map.count mp m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5230
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5231
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5232
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5233
(* Comparing.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5234
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5235
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5236
fun compareValue ((),()) = EQUAL;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5237
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5238
fun equalValue () () = true;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5239
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5240
fun compare (Metis_Set m1, Metis_Set m2) = Metis_Map.compare compareValue (m1,m2);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5241
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5242
fun equal (Metis_Set m1) (Metis_Set m2) = Metis_Map.equal equalValue m1 m2;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5243
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5244
fun subset (Metis_Set m1) (Metis_Set m2) = Metis_Map.subsetDomain m1 m2;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5245
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5246
fun disjoint (Metis_Set m1) (Metis_Set m2) = Metis_Map.disjointDomain m1 m2;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5247
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5248
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5249
(* Converting to and from lists.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5250
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5251
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5252
fun transform f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5253
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5254
      fun inc (x,l) = f x :: l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5255
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5256
      foldr inc []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5257
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5258
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5259
fun toList (Metis_Set m) = Metis_Map.keys m;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5260
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5261
fun fromList cmp elts = addList (empty cmp) elts;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5262
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5263
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5264
(* Pretty-printing.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5265
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5266
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5267
fun toString set =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5268
    "{" ^ (if null set then "" else Int.toString (size set)) ^ "}";
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5269
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5270
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5271
(* Iterators over sets                                                       *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5272
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5273
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5274
type 'elt iterator = ('elt,unit) Metis_Map.iterator;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5275
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5276
fun mkIterator (Metis_Set m) = Metis_Map.mkIterator m;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5277
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5278
fun mkRevIterator (Metis_Set m) = Metis_Map.mkRevIterator m;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5279
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5280
fun readIterator iter =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5281
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5282
      val (elt,()) = Metis_Map.readIterator iter
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5283
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5284
      elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5285
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5286
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5287
fun advanceIterator iter = Metis_Map.advanceIterator iter;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5288
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5289
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5290
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  5291
(**** Original file: src/ElementSet.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5292
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5293
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5294
(* FINITE SETS WITH A FIXED ELEMENT TYPE                                     *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5295
(* Copyright (c) 2004 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5296
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5297
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5298
signature Metis_ElementSet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5299
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5300
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5301
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5302
(* A type of set elements.                                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5303
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5304
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5305
type element
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5306
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  5307
val compareElement : element * element -> order
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  5308
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  5309
val equalElement : element -> element -> bool
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  5310
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5311
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5312
(* A type of finite sets.                                                    *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5313
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5314
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5315
type set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5316
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5317
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5318
(* Constructors.                                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5319
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5320
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5321
val empty : set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5322
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5323
val singleton : element -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5324
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5325
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5326
(* Metis_Set size.                                                                 *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5327
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5328
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5329
val null : set -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5330
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5331
val size : set -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5332
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5333
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5334
(* Querying.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5335
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5336
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5337
val peek : set -> element -> element option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5338
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5339
val member : element -> set -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5340
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5341
val pick : set -> element  (* an arbitrary element *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5342
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5343
val nth : set -> int -> element  (* in the range [0,size-1] *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5344
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5345
val random : set -> element
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5346
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5347
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5348
(* Adding.                                                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5349
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5350
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5351
val add : set -> element -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5352
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5353
val addList : set -> element list -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5354
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5355
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5356
(* Removing.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5357
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5358
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5359
val delete : set -> element -> set  (* must be present *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5360
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5361
val remove : set -> element -> set
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5362
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5363
val deletePick : set -> element * set
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5364
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5365
val deleteNth : set -> int -> element * set
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5366
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5367
val deleteRandom : set -> element * set
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5368
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5369
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5370
(* Joining.                                                                  *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5371
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5372
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5373
val union : set -> set -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5374
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5375
val unionList : set list -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5376
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5377
val intersect : set -> set -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5378
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5379
val intersectList : set list -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5380
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5381
val difference : set -> set -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5382
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5383
val symmetricDifference : set -> set -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5384
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5385
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5386
(* Mapping and folding.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5387
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5388
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5389
val filter : (element -> bool) -> set -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5390
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5391
val partition : (element -> bool) -> set -> set * set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5392
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5393
val app : (element -> unit) -> set -> unit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5394
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5395
val foldl : (element * 's -> 's) -> 's -> set -> 's
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5396
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5397
val foldr : (element * 's -> 's) -> 's -> set -> 's
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5398
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5399
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5400
(* Searching.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5401
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5402
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5403
val findl : (element -> bool) -> set -> element option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5404
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5405
val findr : (element -> bool) -> set -> element option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5406
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5407
val firstl : (element -> 'a option) -> set -> 'a option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5408
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5409
val firstr : (element -> 'a option) -> set -> 'a option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5410
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5411
val exists : (element -> bool) -> set -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5412
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5413
val all : (element -> bool) -> set -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5414
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5415
val count : (element -> bool) -> set -> int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5416
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5417
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5418
(* Comparing.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5419
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5420
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5421
val compare : set * set -> order
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5422
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5423
val equal : set -> set -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5424
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5425
val subset : set -> set -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5426
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5427
val disjoint : set -> set -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5428
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5429
(* ------------------------------------------------------------------------- *)
43269
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5430
(* Closing under an operation.                                               *)
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5431
(* ------------------------------------------------------------------------- *)
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5432
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5433
val closedAdd : (element -> set) -> set -> set -> set
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5434
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5435
val close : (element -> set) -> set -> set
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5436
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5437
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5438
(* Converting to and from lists.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5439
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5440
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5441
val transform : (element -> 'a) -> set -> 'a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5443
val toList : set -> element list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5444
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5445
val fromList : element list -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5446
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5447
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5448
(* Converting to and from maps.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5449
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5450
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5451
type 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5452
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5453
val mapPartial : (element -> 'a option) -> set -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5454
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5455
val map : (element -> 'a) -> set -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5456
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5457
val domain : 'a map -> set
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5458
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5459
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5460
(* Pretty-printing.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5461
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5462
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5463
val toString : set -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5464
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5465
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5466
(* Iterators over sets                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5467
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5468
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5469
type iterator
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5470
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5471
val mkIterator : set -> iterator option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5472
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5473
val mkRevIterator : set -> iterator option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5474
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5475
val readIterator : iterator -> element
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5476
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5477
val advanceIterator : iterator -> iterator option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5478
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5479
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5480
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  5481
(**** Original file: src/ElementSet.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5482
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5483
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5484
(* FINITE SETS WITH A FIXED ELEMENT TYPE                                     *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5485
(* Copyright (c) 2004 Joe Hurd, distributed under the BSD License            *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5486
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5487
43269
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5488
functor Metis_ElementSet (
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5489
  KM : Metis_KeyMap
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5490
) :> Metis_ElementSet
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5491
where type element = KM.key
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5492
and type 'a map = 'a KM.map =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5493
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5494
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5495
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5496
(* A type of set elements.                                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5497
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5498
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5499
type element = KM.key;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5500
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  5501
val compareElement = KM.compareKey;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  5502
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  5503
val equalElement = KM.equalKey;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  5504
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5505
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5506
(* A type of finite sets.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5507
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5508
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5509
type 'a map = 'a KM.map;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5510
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5511
datatype set = Metis_Set of unit map;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5512
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5513
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5514
(* Converting to and from maps.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5515
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5516
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5517
fun dest (Metis_Set m) = m;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5518
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5519
fun mapPartial f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5520
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5521
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5522
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5523
      fn Metis_Set m => KM.mapPartial mf m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5524
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5525
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5526
fun map f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5527
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5528
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5529
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5530
      fn Metis_Set m => KM.map mf m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5531
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5532
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5533
fun domain m = Metis_Set (KM.transform (fn _ => ()) m);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5534
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5535
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5536
(* Constructors.                                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5537
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5538
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5539
val empty = Metis_Set (KM.new ());
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5540
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5541
fun singleton elt = Metis_Set (KM.singleton (elt,()));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5542
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5543
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5544
(* Metis_Set size.                                                                 *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5545
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5546
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5547
fun null (Metis_Set m) = KM.null m;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5548
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5549
fun size (Metis_Set m) = KM.size m;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5550
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5551
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5552
(* Querying.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5553
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5554
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5555
fun peek (Metis_Set m) elt =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5556
    case KM.peekKey m elt of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5557
      SOME (elt,()) => SOME elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5558
    | NONE => NONE;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5559
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5560
fun member elt (Metis_Set m) = KM.inDomain elt m;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5561
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5562
fun pick (Metis_Set m) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5563
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5564
      val (elt,_) = KM.pick m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5565
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5566
      elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5567
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5568
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5569
fun nth (Metis_Set m) n =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5570
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5571
      val (elt,_) = KM.nth m n
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5572
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5573
      elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5574
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5575
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5576
fun random (Metis_Set m) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5577
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5578
      val (elt,_) = KM.random m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5579
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5580
      elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5581
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5582
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5583
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5584
(* Adding.                                                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5585
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5586
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5587
fun add (Metis_Set m) elt =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5588
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5589
      val m = KM.insert m (elt,())
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5590
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5591
      Metis_Set m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5592
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5593
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5594
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5595
  fun uncurriedAdd (elt,set) = add set elt;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5596
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5597
  fun addList set = List.foldl uncurriedAdd set;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5598
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5599
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5600
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5601
(* Removing.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5602
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5603
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5604
fun delete (Metis_Set m) elt =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5605
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5606
      val m = KM.delete m elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5607
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5608
      Metis_Set m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5609
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5610
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5611
fun remove (Metis_Set m) elt =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5612
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5613
      val m = KM.remove m elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5614
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5615
      Metis_Set m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5616
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5617
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5618
fun deletePick (Metis_Set m) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5619
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5620
      val ((elt,()),m) = KM.deletePick m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5621
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5622
      (elt, Metis_Set m)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5623
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5624
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5625
fun deleteNth (Metis_Set m) n =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5626
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5627
      val ((elt,()),m) = KM.deleteNth m n
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5628
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5629
      (elt, Metis_Set m)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5630
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5631
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5632
fun deleteRandom (Metis_Set m) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5633
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5634
      val ((elt,()),m) = KM.deleteRandom m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5635
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5636
      (elt, Metis_Set m)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5637
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5638
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5639
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5640
(* Joining.                                                                  *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5641
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5642
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5643
fun union (Metis_Set m1) (Metis_Set m2) = Metis_Set (KM.unionDomain m1 m2);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5644
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5645
fun unionList sets =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5646
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5647
      val ms = List.map dest sets
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5648
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5649
      Metis_Set (KM.unionListDomain ms)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5650
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5651
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5652
fun intersect (Metis_Set m1) (Metis_Set m2) = Metis_Set (KM.intersectDomain m1 m2);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5653
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5654
fun intersectList sets =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5655
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5656
      val ms = List.map dest sets
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5657
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5658
      Metis_Set (KM.intersectListDomain ms)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5659
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5660
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5661
fun difference (Metis_Set m1) (Metis_Set m2) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5662
    Metis_Set (KM.differenceDomain m1 m2);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5663
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5664
fun symmetricDifference (Metis_Set m1) (Metis_Set m2) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5665
    Metis_Set (KM.symmetricDifferenceDomain m1 m2);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5666
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5667
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5668
(* Mapping and folding.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5669
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5670
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5671
fun filter pred =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5672
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5673
      fun mpred (elt,()) = pred elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5674
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5675
      fn Metis_Set m => Metis_Set (KM.filter mpred m)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5676
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5677
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5678
fun partition pred =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5679
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5680
      fun mpred (elt,()) = pred elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5681
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5682
      fn Metis_Set m =>
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5683
         let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5684
           val (m1,m2) = KM.partition mpred m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5685
         in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5686
           (Metis_Set m1, Metis_Set m2)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5687
         end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5688
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5689
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5690
fun app f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5691
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5692
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5693
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5694
      fn Metis_Set m => KM.app mf m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5695
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5696
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5697
fun foldl f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5698
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5699
      fun mf (elt,(),acc) = f (elt,acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5700
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5701
      fn acc => fn Metis_Set m => KM.foldl mf acc m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5702
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5703
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5704
fun foldr f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5705
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5706
      fun mf (elt,(),acc) = f (elt,acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5707
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5708
      fn acc => fn Metis_Set m => KM.foldr mf acc m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5709
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5710
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5711
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5712
(* Searching.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5713
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5714
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5715
fun findl p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5716
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5717
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5718
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5719
      fn Metis_Set m =>
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5720
         case KM.findl mp m of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5721
           SOME (elt,()) => SOME elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5722
         | NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5723
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5724
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5725
fun findr p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5726
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5727
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5728
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5729
      fn Metis_Set m =>
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5730
         case KM.findr mp m of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5731
           SOME (elt,()) => SOME elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5732
         | NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5733
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5734
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5735
fun firstl f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5736
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5737
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5738
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5739
      fn Metis_Set m => KM.firstl mf m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5740
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5741
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5742
fun firstr f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5743
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5744
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5745
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5746
      fn Metis_Set m => KM.firstr mf m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5747
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5748
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5749
fun exists p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5750
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5751
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5752
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5753
      fn Metis_Set m => KM.exists mp m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5754
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5755
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5756
fun all p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5757
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5758
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5759
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5760
      fn Metis_Set m => KM.all mp m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5761
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5762
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5763
fun count p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5764
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5765
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5766
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5767
      fn Metis_Set m => KM.count mp m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5768
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5769
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5770
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5771
(* Comparing.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5772
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5773
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5774
fun compareValue ((),()) = EQUAL;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5775
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5776
fun equalValue () () = true;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5777
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5778
fun compare (Metis_Set m1, Metis_Set m2) = KM.compare compareValue (m1,m2);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5779
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5780
fun equal (Metis_Set m1) (Metis_Set m2) = KM.equal equalValue m1 m2;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5781
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5782
fun subset (Metis_Set m1) (Metis_Set m2) = KM.subsetDomain m1 m2;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5783
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5784
fun disjoint (Metis_Set m1) (Metis_Set m2) = KM.disjointDomain m1 m2;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5785
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5786
(* ------------------------------------------------------------------------- *)
43269
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5787
(* Closing under an operation.                                               *)
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5788
(* ------------------------------------------------------------------------- *)
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5789
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5790
fun closedAdd f =
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5791
    let
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5792
      fun adds acc set = foldl check acc set
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5793
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5794
      and check (elt,acc) =
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5795
          if member elt acc then acc
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5796
          else expand (add acc elt) elt
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5797
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5798
      and expand acc elt = adds acc (f elt)
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5799
    in
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5800
      adds
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5801
    end;
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5802
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5803
fun close f = closedAdd f empty;
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5804
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5805
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5806
(* Converting to and from lists.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5807
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5808
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5809
fun transform f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5810
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5811
      fun inc (x,l) = f x :: l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5812
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5813
      foldr inc []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5814
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5815
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5816
fun toList (Metis_Set m) = KM.keys m;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5817
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5818
fun fromList elts = addList empty elts;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5819
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5820
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5821
(* Pretty-printing.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5822
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5823
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5824
fun toString set =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5825
    "{" ^ (if null set then "" else Int.toString (size set)) ^ "}";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5826
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5827
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5828
(* Iterators over sets                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5829
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5830
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5831
type iterator = unit KM.iterator;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5832
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5833
fun mkIterator (Metis_Set m) = KM.mkIterator m;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5834
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5835
fun mkRevIterator (Metis_Set m) = KM.mkRevIterator m;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5836
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5837
fun readIterator iter =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5838
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5839
      val (elt,()) = KM.readIterator iter
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5840
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5841
      elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5842
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5843
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5844
fun advanceIterator iter = KM.advanceIterator iter;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5845
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5846
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5847
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5848
structure Metis_IntSet =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5849
Metis_ElementSet (Metis_IntMap);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5850
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5851
structure Metis_IntPairSet =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5852
Metis_ElementSet (Metis_IntPairMap);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5853
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5854
structure Metis_StringSet =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5855
Metis_ElementSet (Metis_StringMap);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5856
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  5857
(**** Original file: src/Sharing.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5858
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5859
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5860
(* PRESERVING SHARING OF ML VALUES                                           *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  5861
(* Copyright (c) 2005 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5862
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5863
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5864
signature Metis_Sharing =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5865
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5866
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5867
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5868
(* Option operations.                                                        *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5869
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5870
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5871
val mapOption : ('a -> 'a) -> 'a option -> 'a option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5872
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5873
val mapsOption : ('a -> 's -> 'a * 's) -> 'a option -> 's -> 'a option * 's
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5874
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5875
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5876
(* List operations.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5877
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5878
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5879
val map : ('a -> 'a) -> 'a list -> 'a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5880
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5881
val revMap : ('a -> 'a) -> 'a list -> 'a list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5882
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5883
val maps : ('a -> 's -> 'a * 's) -> 'a list -> 's -> 'a list * 's
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5884
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5885
val revMaps : ('a -> 's -> 'a * 's) -> 'a list -> 's -> 'a list * 's
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5886
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5887
val updateNth : int * 'a -> 'a list -> 'a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5888
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5889
val setify : ''a list -> ''a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5890
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5891
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5892
(* Function caching.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5893
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5894
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5895
val cache : ('a * 'a -> order) -> ('a -> 'b) -> 'a -> 'b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5896
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5897
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5898
(* Hash consing.                                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5899
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5900
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5901
val hashCons : ('a * 'a -> order) -> 'a -> 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5902
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5903
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5904
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  5905
(**** Original file: src/Sharing.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5906
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5907
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5908
(* PRESERVING SHARING OF ML VALUES                                           *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  5909
(* Copyright (c) 2005 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5910
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5911
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5912
structure Metis_Sharing :> Metis_Sharing =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5913
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5914
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5915
infix ==
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5916
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5917
val op== = Metis_Portable.pointerEqual;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5918
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5919
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5920
(* Option operations.                                                        *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5921
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5922
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5923
fun mapOption f xo =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5924
    case xo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5925
      SOME x =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5926
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5927
        val y = f x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5928
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5929
        if x == y then xo else SOME y
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5930
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5931
    | NONE => xo;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5932
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5933
fun mapsOption f xo acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5934
    case xo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5935
      SOME x =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5936
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5937
        val (y,acc) = f x acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5938
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5939
        if x == y then (xo,acc) else (SOME y, acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5940
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5941
    | NONE => (xo,acc);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5942
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5943
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5944
(* List operations.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5945
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5946
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5947
fun map f =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5948
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5949
      fun m ys ys_xs xs =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5950
          case xs of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5951
            [] => List.revAppend ys_xs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5952
          | x :: xs =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5953
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5954
              val y = f x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5955
              val ys = y :: ys
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5956
              val ys_xs = if x == y then ys_xs else (ys,xs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5957
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5958
              m ys ys_xs xs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5959
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5960
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5961
      fn xs => m [] ([],xs) xs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5962
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5963
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5964
fun maps f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5965
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5966
      fun m acc ys ys_xs xs =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5967
          case xs of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5968
            [] => (List.revAppend ys_xs, acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5969
          | x :: xs =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5970
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5971
              val (y,acc) = f x acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5972
              val ys = y :: ys
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5973
              val ys_xs = if x == y then ys_xs else (ys,xs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5974
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5975
              m acc ys ys_xs xs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5976
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5977
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5978
      fn xs => fn acc => m acc [] ([],xs) xs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5979
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5980
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5981
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5982
  fun revTails acc xs =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5983
      case xs of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5984
        [] => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5985
      | x :: xs' => revTails ((x,xs) :: acc) xs';
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5986
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5987
  fun revMap f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5988
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5989
        fun m ys same xxss =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5990
            case xxss of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5991
              [] => ys
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5992
            | (x,xs) :: xxss =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5993
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5994
                val y = f x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5995
                val same = same andalso x == y
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5996
                val ys = if same then xs else y :: ys
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5997
              in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5998
                m ys same xxss
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5999
              end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6000
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6001
        fn xs => m [] true (revTails [] xs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6002
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6003
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6004
  fun revMaps f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6005
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6006
        fun m acc ys same xxss =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6007
            case xxss of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6008
              [] => (ys,acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6009
            | (x,xs) :: xxss =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6010
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6011
                val (y,acc) = f x acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6012
                val same = same andalso x == y
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6013
                val ys = if same then xs else y :: ys
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6014
              in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6015
                m acc ys same xxss
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6016
              end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6017
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6018
        fn xs => fn acc => m acc [] true (revTails [] xs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6019
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6020
end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6021
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6022
fun updateNth (n,x) l =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6023
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6024
      val (a,b) = Metis_Useful.revDivide l n
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6025
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6026
      case b of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6027
        [] => raise Subscript
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6028
      | h :: t => if x == h then l else List.revAppend (a, x :: t)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6029
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6030
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6031
fun setify l =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6032
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6033
      val l' = Metis_Useful.setify l
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6034
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6035
      if length l' = length l then l else l'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6036
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6037
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6038
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6039
(* Function caching.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6040
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6041
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6042
fun cache cmp f =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6043
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6044
      val cache = Unsynchronized.ref (Metis_Map.new cmp)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6045
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6046
      fn a =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6047
         case Metis_Map.peek (!cache) a of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6048
           SOME b => b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6049
         | NONE =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6050
           let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6051
             val b = f a
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6052
             val () = cache := Metis_Map.insert (!cache) (a,b)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6053
           in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6054
             b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6055
           end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6056
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6057
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6058
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6059
(* Hash consing.                                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6060
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6061
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6062
fun hashCons cmp = cache cmp Metis_Useful.I;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6063
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6064
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6065
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6066
(**** Original file: src/Stream.sig ****)
39433
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6067
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6068
(* ========================================================================= *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6069
(* A POSSIBLY-INFINITE STREAM DATATYPE FOR ML                                *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6070
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
39433
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6071
(* ========================================================================= *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6072
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6073
signature Metis_Stream =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6074
sig
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6075
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6076
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6077
(* The stream type.                                                          *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6078
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6079
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6080
datatype 'a stream = Nil | Cons of 'a * (unit -> 'a stream)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6081
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6082
(* If you're wondering how to create an infinite stream: *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6083
(* val stream4 = let fun s4 () = Metis_Stream.Cons (4,s4) in s4 () end; *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6084
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6085
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6086
(* Metis_Stream constructors.                                                      *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6087
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6088
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6089
val repeat : 'a -> 'a stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6090
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6091
val count : int -> int stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6092
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6093
val funpows : ('a -> 'a) -> 'a -> 'a stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6094
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6095
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6096
(* Metis_Stream versions of standard list operations: these should all terminate.  *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6097
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6098
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6099
val cons : 'a -> (unit -> 'a stream) -> 'a stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6100
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6101
val null : 'a stream -> bool
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6102
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6103
val hd : 'a stream -> 'a  (* raises Empty *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6104
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6105
val tl : 'a stream -> 'a stream  (* raises Empty *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6106
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6107
val hdTl : 'a stream -> 'a * 'a stream  (* raises Empty *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6108
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6109
val singleton : 'a -> 'a stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6110
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6111
val append : 'a stream -> (unit -> 'a stream) -> 'a stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6112
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6113
val map : ('a -> 'b) -> 'a stream -> 'b stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6114
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6115
val maps :
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6116
    ('a -> 's -> 'b * 's) -> ('s -> 'b stream) -> 's -> 'a stream -> 'b stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6117
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6118
val zipwith : ('a -> 'b -> 'c) -> 'a stream -> 'b stream -> 'c stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6119
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6120
val zip : 'a stream -> 'b stream -> ('a * 'b) stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6121
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6122
val take : int -> 'a stream -> 'a stream  (* raises Subscript *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6123
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6124
val drop : int -> 'a stream -> 'a stream  (* raises Subscript *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6125
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6126
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6127
(* Metis_Stream versions of standard list operations: these might not terminate.   *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6128
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6129
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6130
val length : 'a stream -> int
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6131
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6132
val exists : ('a -> bool) -> 'a stream -> bool
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6133
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6134
val all : ('a -> bool) -> 'a stream -> bool
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6135
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6136
val filter : ('a -> bool) -> 'a stream -> 'a stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6137
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6138
val foldl : ('a * 's -> 's) -> 's -> 'a stream -> 's
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6139
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6140
val concat : 'a stream stream -> 'a stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6141
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6142
val mapPartial : ('a -> 'b option) -> 'a stream -> 'b stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6143
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6144
val mapsPartial :
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6145
    ('a -> 's -> 'b option * 's) -> ('s -> 'b stream) -> 's ->
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6146
    'a stream -> 'b stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6147
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6148
val mapConcat : ('a -> 'b stream) -> 'a stream -> 'b stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6149
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6150
val mapsConcat :
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6151
    ('a -> 's -> 'b stream * 's) -> ('s -> 'b stream) -> 's ->
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6152
    'a stream -> 'b stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6153
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6154
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6155
(* Metis_Stream operations.                                                        *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6156
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6157
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6158
val memoize : 'a stream -> 'a stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6159
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6160
val listConcat : 'a list stream -> 'a stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6161
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6162
val concatList : 'a stream list -> 'a stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6163
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6164
val toList : 'a stream -> 'a list
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6165
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6166
val fromList : 'a list -> 'a stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6167
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6168
val toString : char stream -> string
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6169
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6170
val fromString : string -> char stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6171
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6172
val toTextFile : {filename : string} -> string stream -> unit
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6173
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6174
val fromTextFile : {filename : string} -> string stream  (* line by line *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6175
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6176
end
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6177
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6178
(**** Original file: src/Stream.sml ****)
39433
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6179
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6180
(* ========================================================================= *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6181
(* A POSSIBLY-INFINITE STREAM DATATYPE FOR ML                                *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6182
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
39433
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6183
(* ========================================================================= *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6184
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6185
structure Metis_Stream :> Metis_Stream =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6186
struct
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6187
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6188
val K = Metis_Useful.K;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6189
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6190
val pair = Metis_Useful.pair;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6191
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6192
val funpow = Metis_Useful.funpow;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6193
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6194
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6195
(* The stream type.                                                          *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6196
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6197
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6198
datatype 'a stream =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6199
    Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6200
  | Cons of 'a * (unit -> 'a stream);
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6201
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6202
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6203
(* Metis_Stream constructors.                                                      *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6204
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6205
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6206
fun repeat x = let fun rep () = Cons (x,rep) in rep () end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6207
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6208
fun count n = Cons (n, fn () => count (n + 1));
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6209
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6210
fun funpows f x = Cons (x, fn () => funpows f (f x));
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6211
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6212
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6213
(* Metis_Stream versions of standard list operations: these should all terminate.  *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6214
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6215
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6216
fun cons h t = Cons (h,t);
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6217
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6218
fun null Nil = true
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6219
  | null (Cons _) = false;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6220
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6221
fun hd Nil = raise Empty
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6222
  | hd (Cons (h,_)) = h;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6223
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6224
fun tl Nil = raise Empty
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6225
  | tl (Cons (_,t)) = t ();
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6226
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6227
fun hdTl s = (hd s, tl s);
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6228
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6229
fun singleton s = Cons (s, K Nil);
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6230
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6231
fun append Nil s = s ()
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6232
  | append (Cons (h,t)) s = Cons (h, fn () => append (t ()) s);
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6233
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6234
fun map f =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6235
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6236
      fun m Nil = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6237
        | m (Cons (h,t)) = Cons (f h, m o t)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6238
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6239
      m
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6240
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6241
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6242
fun maps f g =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6243
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6244
      fun mm s Nil = g s
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6245
        | mm s (Cons (x,xs)) =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6246
          let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6247
            val (y,s') = f x s
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6248
          in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6249
            Cons (y, mm s' o xs)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6250
          end
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6251
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6252
      mm
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6253
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6254
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6255
fun zipwith f =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6256
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6257
      fun z Nil _ = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6258
        | z _ Nil = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6259
        | z (Cons (x,xs)) (Cons (y,ys)) =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6260
          Cons (f x y, fn () => z (xs ()) (ys ()))
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6261
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6262
      z
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6263
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6264
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6265
fun zip s t = zipwith pair s t;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6266
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6267
fun take 0 _ = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6268
  | take n Nil = raise Subscript
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6269
  | take 1 (Cons (x,_)) = Cons (x, K Nil)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6270
  | take n (Cons (x,xs)) = Cons (x, fn () => take (n - 1) (xs ()));
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6271
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6272
fun drop n s = funpow n tl s handle Empty => raise Subscript;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6273
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6274
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6275
(* Metis_Stream versions of standard list operations: these might not terminate.   *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6276
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6277
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6278
local
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6279
  fun len n Nil = n
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6280
    | len n (Cons (_,t)) = len (n + 1) (t ());
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6281
in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6282
  fun length s = len 0 s;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6283
end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6284
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6285
fun exists pred =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6286
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6287
      fun f Nil = false
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6288
        | f (Cons (h,t)) = pred h orelse f (t ())
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6289
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6290
      f
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6291
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6292
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6293
fun all pred = not o exists (not o pred);
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6294
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6295
fun filter p Nil = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6296
  | filter p (Cons (x,xs)) =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6297
    if p x then Cons (x, fn () => filter p (xs ())) else filter p (xs ());
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6298
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6299
fun foldl f =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6300
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6301
      fun fold b Nil = b
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6302
        | fold b (Cons (h,t)) = fold (f (h,b)) (t ())
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6303
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6304
      fold
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6305
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6306
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6307
fun concat Nil = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6308
  | concat (Cons (Nil, ss)) = concat (ss ())
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6309
  | concat (Cons (Cons (x, xs), ss)) =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6310
    Cons (x, fn () => concat (Cons (xs (), ss)));
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6311
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6312
fun mapPartial f =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6313
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6314
      fun mp Nil = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6315
        | mp (Cons (h,t)) =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6316
          case f h of
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6317
            NONE => mp (t ())
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6318
          | SOME h' => Cons (h', fn () => mp (t ()))
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6319
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6320
      mp
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6321
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6322
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6323
fun mapsPartial f g =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6324
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6325
      fun mp s Nil = g s
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6326
        | mp s (Cons (h,t)) =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6327
          let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6328
            val (h,s) = f h s
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6329
          in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6330
            case h of
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6331
              NONE => mp s (t ())
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6332
            | SOME h => Cons (h, fn () => mp s (t ()))
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6333
          end
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6334
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6335
      mp
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6336
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6337
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6338
fun mapConcat f =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6339
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6340
      fun mc Nil = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6341
        | mc (Cons (h,t)) = append (f h) (fn () => mc (t ()))
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6342
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6343
      mc
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6344
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6345
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6346
fun mapsConcat f g =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6347
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6348
      fun mc s Nil = g s
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6349
        | mc s (Cons (h,t)) =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6350
          let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6351
            val (l,s) = f h s
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6352
          in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6353
            append l (fn () => mc s (t ()))
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6354
          end
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6355
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6356
      mc
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6357
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6358
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6359
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6360
(* Metis_Stream operations.                                                        *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6361
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6362
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6363
fun memoize Nil = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6364
  | memoize (Cons (h,t)) = Cons (h, Metis_Lazy.memoize (fn () => memoize (t ())));
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6365
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6366
fun concatList [] = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6367
  | concatList (h :: t) = append h (fn () => concatList t);
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6368
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6369
local
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6370
  fun toLst res Nil = List.rev res
39433
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6371
    | toLst res (Cons (x, xs)) = toLst (x :: res) (xs ());
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6372
in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6373
  fun toList s = toLst [] s;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6374
end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6375
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6376
fun fromList [] = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6377
  | fromList (x :: xs) = Cons (x, fn () => fromList xs);
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6378
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6379
fun listConcat s = concat (map fromList s);
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6380
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6381
fun toString s = String.implode (toList s);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6382
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6383
fun fromString s = fromList (String.explode s);
39433
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6384
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6385
fun toTextFile {filename = f} s =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6386
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6387
      val (h,close) =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6388
          if f = "-" then (TextIO.stdOut, K ())
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6389
          else (TextIO.openOut f, TextIO.closeOut)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6390
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6391
      fun toFile Nil = ()
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6392
        | toFile (Cons (x,y)) = (TextIO.output (h,x); toFile (y ()))
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6393
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6394
      val () = toFile s
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6395
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6396
      close h
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6397
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6398
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6399
fun fromTextFile {filename = f} =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6400
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6401
      val (h,close) =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6402
          if f = "-" then (TextIO.stdIn, K ())
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6403
          else (TextIO.openIn f, TextIO.closeIn)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6404
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6405
      fun strm () =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6406
          case TextIO.inputLine h of
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6407
            NONE => (close h; Nil)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6408
          | SOME s => Cons (s,strm)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6409
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6410
      memoize (strm ())
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6411
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6412
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6413
end
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6414
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6415
(**** Original file: src/Heap.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6416
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6417
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6418
(* A HEAP DATATYPE FOR ML                                                    *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6419
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6420
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6421
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6422
signature Metis_Heap =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6423
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6424
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6425
type 'a heap
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6426
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6427
val new : ('a * 'a -> order) -> 'a heap
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6428
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6429
val add : 'a heap -> 'a -> 'a heap
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6430
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6431
val null : 'a heap -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6432
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6433
val top : 'a heap -> 'a  (* raises Empty *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6434
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6435
val remove : 'a heap -> 'a * 'a heap  (* raises Empty *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6436
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6437
val size : 'a heap -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6438
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6439
val app : ('a -> unit) -> 'a heap -> unit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6440
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6441
val toList : 'a heap -> 'a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6442
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6443
val toStream : 'a heap -> 'a Metis_Stream.stream
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6444
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6445
val toString : 'a heap -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6446
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6447
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6448
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6449
(**** Original file: src/Heap.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6450
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6451
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6452
(* A HEAP DATATYPE FOR ML                                                    *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6453
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6454
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6455
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6456
structure Metis_Heap :> Metis_Heap =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6457
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6458
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6459
(* Leftist heaps as in Purely Functional Data Structures, by Chris Okasaki *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6460
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6461
datatype 'a node = E | T of int * 'a * 'a node * 'a node;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6462
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6463
datatype 'a heap = Metis_Heap of ('a * 'a -> order) * int * 'a node;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6464
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6465
fun rank E = 0
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6466
  | rank (T (r,_,_,_)) = r;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6467
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6468
fun makeT (x,a,b) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6469
  if rank a >= rank b then T (rank b + 1, x, a, b) else T (rank a + 1, x, b, a);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6470
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6471
fun merge cmp =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6472
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6473
      fun mrg (h,E) = h
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6474
        | mrg (E,h) = h
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6475
        | mrg (h1 as T (_,x,a1,b1), h2 as T (_,y,a2,b2)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6476
          case cmp (x,y) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6477
            GREATER => makeT (y, a2, mrg (h1,b2))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6478
          | _ => makeT (x, a1, mrg (b1,h2))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6479
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6480
      mrg
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6481
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6482
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6483
fun new cmp = Metis_Heap (cmp,0,E);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6484
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6485
fun add (Metis_Heap (f,n,a)) x = Metis_Heap (f, n + 1, merge f (T (1,x,E,E), a));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6486
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6487
fun size (Metis_Heap (_, n, _)) = n;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6488
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6489
fun null h = size h = 0;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6490
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6491
fun top (Metis_Heap (_,_,E)) = raise Empty
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6492
  | top (Metis_Heap (_, _, T (_,x,_,_))) = x;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6493
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6494
fun remove (Metis_Heap (_,_,E)) = raise Empty
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6495
  | remove (Metis_Heap (f, n, T (_,x,a,b))) = (x, Metis_Heap (f, n - 1, merge f (a,b)));
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6496
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6497
fun app f =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6498
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6499
      fun ap [] = ()
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6500
        | ap (E :: rest) = ap rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6501
        | ap (T (_,d,a,b) :: rest) = (f d; ap (a :: b :: rest))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6502
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6503
      fn Metis_Heap (_,_,a) => ap [a]
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6504
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6505
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6506
fun toList h =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6507
    if null h then []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6508
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6509
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6510
        val (x,h) = remove h
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6511
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6512
        x :: toList h
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6513
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6514
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6515
fun toStream h =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6516
    if null h then Metis_Stream.Nil
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6517
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6518
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6519
        val (x,h) = remove h
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6520
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6521
        Metis_Stream.Cons (x, fn () => toStream h)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6522
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6523
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6524
fun toString h =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6525
    "Metis_Heap[" ^ (if null h then "" else Int.toString (size h)) ^ "]";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6526
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6527
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6528
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6529
(**** Original file: src/Print.sig ****)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6530
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6531
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6532
(* PRETTY-PRINTING                                                           *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6533
(* Copyright (c) 2008 Joe Hurd, distributed under the BSD License            *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6534
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6535
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6536
signature Metis_Print =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6537
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6538
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6539
(* ------------------------------------------------------------------------- *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6540
(* Escaping strings.                                                         *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6541
(* ------------------------------------------------------------------------- *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6542
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6543
val escapeString : {escape : char list} -> string -> string
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6544
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6545
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6546
(* A type of pretty-printers.                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6547
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6548
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6549
type ppstream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6550
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6551
type 'a pp = 'a -> ppstream
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6552
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6553
val skip : ppstream
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6554
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6555
val sequence : ppstream -> ppstream -> ppstream
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6556
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6557
val duplicate : int -> ppstream -> ppstream
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6558
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6559
val program : ppstream list -> ppstream
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6560
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6561
val stream : ppstream Metis_Stream.stream -> ppstream
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6562
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6563
val ppPpstream : ppstream pp
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6564
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6565
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6566
(* Pretty-printing blocks.                                                   *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6567
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6568
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6569
datatype style = Consistent | Inconsistent
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6570
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6571
datatype block =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6572
    Block of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6573
      {style : style,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6574
       indent : int}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6575
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6576
val styleBlock : block -> style
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6577
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6578
val indentBlock : block -> int
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6579
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6580
val block : block -> ppstream -> ppstream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6581
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6582
val consistentBlock : int -> ppstream list -> ppstream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6583
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6584
val inconsistentBlock : int -> ppstream list -> ppstream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6585
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6586
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6587
(* Words are unbreakable strings annotated with their effective size.        *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6588
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6589
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6590
datatype word = Word of {word : string, size : int}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6591
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6592
val mkWord : string -> word
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6593
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6594
val emptyWord : word
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6595
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6596
val charWord : char -> word
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6597
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6598
val ppWord : word pp
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6599
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6600
val space : ppstream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6601
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6602
val spaces : int -> ppstream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6603
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6604
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6605
(* Possible line breaks.                                                     *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6606
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6607
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6608
datatype break = Break of {size : int, extraIndent : int}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6609
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6610
val mkBreak : int -> break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6611
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6612
val ppBreak : break pp
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6613
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6614
val break : ppstream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6615
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6616
val breaks : int -> ppstream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6617
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6618
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6619
(* Forced line breaks.                                                       *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6620
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6621
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6622
val newline : ppstream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6623
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6624
val newlines : int -> ppstream
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6625
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6626
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6627
(* Pretty-printer combinators.                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6628
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6629
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6630
val ppMap : ('a -> 'b) -> 'b pp -> 'a pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6631
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6632
val ppBracket : string -> string -> 'a pp -> 'a pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6633
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6634
val ppOp : string -> ppstream
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6635
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6636
val ppOp2 : string -> 'a pp -> 'b pp -> ('a * 'b) pp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6637
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6638
val ppOp3 : string -> string -> 'a pp -> 'b pp -> 'c pp -> ('a * 'b * 'c) pp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6639
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6640
val ppOpList : string -> 'a pp -> 'a list pp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6641
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6642
val ppOpStream : string -> 'a pp -> 'a Metis_Stream.stream pp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6643
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6644
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6645
(* Pretty-printers for common types.                                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6646
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6647
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6648
val ppChar : char pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6649
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6650
val ppString : string pp
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6651
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6652
val ppEscapeString : {escape : char list} -> string pp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6653
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6654
val ppUnit : unit pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6655
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6656
val ppBool : bool pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6657
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6658
val ppInt : int pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6659
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6660
val ppPrettyInt : int pp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6661
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6662
val ppReal : real pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6663
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6664
val ppPercent : real pp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6665
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6666
val ppOrder : order pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6667
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6668
val ppList : 'a pp -> 'a list pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6669
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6670
val ppStream : 'a pp -> 'a Metis_Stream.stream pp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6671
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6672
val ppOption : 'a pp -> 'a option pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6673
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6674
val ppPair : 'a pp -> 'b pp -> ('a * 'b) pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6675
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6676
val ppTriple : 'a pp -> 'b pp -> 'c pp -> ('a * 'b * 'c) pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6677
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  6678
val ppException : exn pp
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  6679
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6680
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6681
(* Pretty-printing infix operators.                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6682
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6683
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6684
type token = string
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6685
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6686
datatype assoc =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6687
    LeftAssoc
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6688
  | NonAssoc
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6689
  | RightAssoc
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6690
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6691
datatype infixes =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6692
    Infixes of
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6693
      {token : token,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6694
       precedence : int,
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6695
       assoc : assoc} list
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6696
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6697
val tokensInfixes : infixes -> Metis_StringSet.set
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6698
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6699
val layerInfixes : infixes -> {tokens : Metis_StringSet.set, assoc : assoc} list
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6700
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6701
val ppInfixes :
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6702
    infixes ->
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6703
    ('a -> (token * 'a * 'a) option) -> ('a * token) pp ->
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6704
    ('a * bool) pp -> ('a * bool) pp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6705
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6706
(* ------------------------------------------------------------------------- *)
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6707
(* Pretty-printer rendering.                                                 *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6708
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6709
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6710
val render :
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6711
    {lineLength : int option} -> ppstream ->
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6712
    {indent : int, line : string} Metis_Stream.stream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6713
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6714
val toStringWithLineLength :
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6715
    {lineLength : int option} -> 'a pp -> 'a -> string
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6716
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6717
val toStreamWithLineLength :
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6718
    {lineLength : int option} -> 'a pp -> 'a -> string Metis_Stream.stream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6719
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6720
val toLine : 'a pp -> 'a -> string
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6721
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6722
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6723
(* Pretty-printer rendering with a global line length.                       *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6724
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6725
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6726
val lineLength : int Unsynchronized.ref
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6727
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6728
val toString : 'a pp -> 'a -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6729
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6730
val toStream : 'a pp -> 'a -> string Metis_Stream.stream
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6731
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6732
val trace : 'a pp -> string -> 'a -> unit
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6733
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6734
end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6735
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6736
(**** Original file: src/Print.sml ****)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6737
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6738
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6739
(* PRETTY-PRINTING                                                           *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6740
(* Copyright (c) 2008 Joe Hurd, distributed under the BSD License            *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6741
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6742
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6743
structure Metis_Print :> Metis_Print =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6744
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6745
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6746
open Metis_Useful;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6747
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6748
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6749
(* Constants.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6750
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6751
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6752
val initialLineLength = 75;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6753
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6754
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6755
(* Helper functions.                                                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6756
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6757
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6758
fun revAppend xs s =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6759
    case xs of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6760
      [] => s ()
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6761
    | x :: xs => revAppend xs (K (Metis_Stream.Cons (x,s)));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6762
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6763
fun revConcat strm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6764
    case strm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6765
      Metis_Stream.Nil => Metis_Stream.Nil
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6766
    | Metis_Stream.Cons (h,t) => revAppend h (fn () => revConcat (t ()));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6767
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6768
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6769
  fun calcSpaces n = nChars #" " n;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6770
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6771
  val cacheSize = 2 * initialLineLength;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6772
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6773
  val cachedSpaces = Vector.tabulate (cacheSize,calcSpaces);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6774
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6775
  fun nSpaces n =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6776
      if n < cacheSize then Vector.sub (cachedSpaces,n)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6777
      else calcSpaces n;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6778
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6779
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6780
(* ------------------------------------------------------------------------- *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6781
(* Escaping strings.                                                         *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6782
(* ------------------------------------------------------------------------- *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6783
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6784
fun escapeString {escape} =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6785
    let
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  6786
      val escapeMap = List.map (fn c => (c, "\\" ^ str c)) escape
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6787
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6788
      fun escapeChar c =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6789
          case c of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6790
            #"\\" => "\\\\"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6791
          | #"\n" => "\\n"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6792
          | #"\t" => "\\t"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6793
          | _ =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6794
            case List.find (equal c o fst) escapeMap of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6795
              SOME (_,s) => s
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6796
            | NONE => str c
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6797
    in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6798
      String.translate escapeChar
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6799
    end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6800
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6801
(* ------------------------------------------------------------------------- *)
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6802
(* Pretty-printing blocks.                                                   *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6803
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6804
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6805
datatype style = Consistent | Inconsistent;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6806
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6807
datatype block =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6808
    Block of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6809
      {style : style,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6810
       indent : int};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6811
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6812
fun toStringStyle style =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6813
    case style of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6814
      Consistent => "Consistent"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6815
    | Inconsistent => "Inconsistent";
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6816
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6817
fun isConsistentStyle style =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6818
    case style of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6819
      Consistent => true
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6820
    | Inconsistent => false;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6821
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6822
fun isInconsistentStyle style =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6823
    case style of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6824
      Inconsistent => true
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6825
    | Consistent => false;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6826
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6827
fun mkBlock style indent =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6828
    Block
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6829
      {style = style,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6830
       indent = indent};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6831
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6832
val mkConsistentBlock = mkBlock Consistent;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6833
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6834
val mkInconsistentBlock = mkBlock Inconsistent;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6835
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6836
fun styleBlock (Block {style = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6837
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6838
fun indentBlock (Block {indent = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6839
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6840
fun isConsistentBlock block = isConsistentStyle (styleBlock block);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6841
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6842
fun isInconsistentBlock block = isInconsistentStyle (styleBlock block);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6843
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6844
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6845
(* Words are unbreakable strings annotated with their effective size.        *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6846
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6847
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6848
datatype word = Word of {word : string, size : int};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6849
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6850
fun mkWord s = Word {word = s, size = String.size s};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6851
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6852
val emptyWord = mkWord "";
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6853
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6854
fun charWord c = mkWord (str c);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6855
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6856
fun spacesWord i = Word {word = nSpaces i, size = i};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6857
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6858
fun sizeWord (Word {size = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6859
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6860
fun renderWord (Word {word = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6861
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6862
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6863
(* Possible line breaks.                                                     *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6864
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6865
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6866
datatype break = Break of {size : int, extraIndent : int};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6867
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6868
fun mkBreak n = Break {size = n, extraIndent = 0};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6869
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6870
fun sizeBreak (Break {size = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6871
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6872
fun extraIndentBreak (Break {extraIndent = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6873
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6874
fun renderBreak b = nSpaces (sizeBreak b);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6875
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6876
fun updateSizeBreak size break =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6877
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6878
      val Break {size = _, extraIndent} = break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6879
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6880
      Break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6881
        {size = size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6882
         extraIndent = extraIndent}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6883
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6884
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6885
fun appendBreak break1 break2 =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6886
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6887
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6888
      val () = warn "merging consecutive pretty-printing breaks"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6889
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6890
      val Break {size = size1, extraIndent = extraIndent1} = break1
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6891
      and Break {size = size2, extraIndent = extraIndent2} = break2
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6892
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6893
      val size = size1 + size2
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6894
      and extraIndent = Int.max (extraIndent1,extraIndent2)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6895
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6896
      Break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6897
        {size = size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6898
         extraIndent = extraIndent}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6899
    end;
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6900
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6901
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6902
(* A type of pretty-printers.                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6903
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6904
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6905
datatype step =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6906
    BeginBlock of block
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6907
  | EndBlock
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6908
  | AddWord of word
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6909
  | AddBreak of break
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6910
  | AddNewline;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6911
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6912
type ppstream = step Metis_Stream.stream;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6913
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6914
type 'a pp = 'a -> ppstream;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6915
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6916
fun toStringStep step =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6917
    case step of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6918
      BeginBlock _ => "BeginBlock"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6919
    | EndBlock => "EndBlock"
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6920
    | AddWord _ => "Word"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6921
    | AddBreak _ => "Break"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6922
    | AddNewline => "Newline";
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6923
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6924
val skip : ppstream = Metis_Stream.Nil;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6925
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6926
fun sequence pp1 pp2 : ppstream = Metis_Stream.append pp1 (K pp2);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6927
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6928
local
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6929
  fun dup pp n () = if n = 1 then pp else Metis_Stream.append pp (dup pp (n - 1));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6930
in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6931
  fun duplicate n pp : ppstream =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6932
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6933
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6934
        val () = if 0 <= n then () else raise Bug "Metis_Print.duplicate"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6935
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6936
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6937
        if n = 0 then skip else dup pp n ()
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6938
      end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6939
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6940
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6941
val program : ppstream list -> ppstream = Metis_Stream.concatList;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6942
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6943
val stream : ppstream Metis_Stream.stream -> ppstream = Metis_Stream.concat;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6944
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6945
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6946
(* Pretty-printing blocks.                                                   *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6947
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6948
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6949
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6950
  fun beginBlock b = Metis_Stream.singleton (BeginBlock b);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6951
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6952
  val endBlock = Metis_Stream.singleton EndBlock;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6953
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6954
  fun block b pp = program [beginBlock b, pp, endBlock];
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6955
end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6956
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6957
fun consistentBlock i pps = block (mkConsistentBlock i) (program pps);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6958
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6959
fun inconsistentBlock i pps = block (mkInconsistentBlock i) (program pps);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6960
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6961
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6962
(* Words are unbreakable strings annotated with their effective size.        *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6963
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6964
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6965
fun ppWord w = Metis_Stream.singleton (AddWord w);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6966
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6967
val space = ppWord (mkWord " ");
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6968
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6969
fun spaces i = ppWord (spacesWord i);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6970
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6971
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6972
(* Possible line breaks.                                                     *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6973
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6974
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6975
fun ppBreak b = Metis_Stream.singleton (AddBreak b);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6976
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6977
fun breaks i = ppBreak (mkBreak i);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6978
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6979
val break = breaks 1;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6980
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6981
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6982
(* Forced line breaks.                                                       *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6983
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6984
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6985
val newline = Metis_Stream.singleton AddNewline;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6986
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6987
fun newlines i = duplicate i newline;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6988
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6989
(* ------------------------------------------------------------------------- *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6990
(* Pretty-printer combinators.                                               *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6991
(* ------------------------------------------------------------------------- *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6992
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6993
fun ppMap f ppB a : ppstream = ppB (f a);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6994
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6995
fun ppBracket' l r ppA a =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6996
    let
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6997
      val n = sizeWord l
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6998
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6999
      inconsistentBlock n
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7000
        [ppWord l,
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7001
         ppA a,
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7002
         ppWord r]
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7003
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7004
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7005
fun ppOp' w = sequence (ppWord w) break;
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7006
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7007
fun ppOp2' ab ppA ppB (a,b) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7008
    inconsistentBlock 0
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7009
      [ppA a,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7010
       ppOp' ab,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7011
       ppB b];
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7012
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7013
fun ppOp3' ab bc ppA ppB ppC (a,b,c) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7014
    inconsistentBlock 0
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7015
      [ppA a,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7016
       ppOp' ab,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7017
       ppB b,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7018
       ppOp' bc,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7019
       ppC c];
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7020
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7021
fun ppOpList' s ppA =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7022
    let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7023
      fun ppOpA a = sequence (ppOp' s) (ppA a)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7024
    in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7025
      fn [] => skip
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7026
       | h :: t => inconsistentBlock 0 (ppA h :: List.map ppOpA t)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7027
    end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7028
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7029
fun ppOpStream' s ppA =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7030
    let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7031
      fun ppOpA a = sequence (ppOp' s) (ppA a)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7032
    in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7033
      fn Metis_Stream.Nil => skip
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7034
       | Metis_Stream.Cons (h,t) =>
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7035
         inconsistentBlock 0
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7036
           [ppA h,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7037
            Metis_Stream.concat (Metis_Stream.map ppOpA (t ()))]
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7038
    end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7039
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7040
fun ppBracket l r = ppBracket' (mkWord l) (mkWord r);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7041
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7042
fun ppOp s = ppOp' (mkWord s);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7043
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7044
fun ppOp2 ab = ppOp2' (mkWord ab);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7045
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7046
fun ppOp3 ab bc = ppOp3' (mkWord ab) (mkWord bc);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7047
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7048
fun ppOpList s = ppOpList' (mkWord s);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7049
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7050
fun ppOpStream s = ppOpStream' (mkWord s);
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7051
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7052
(* ------------------------------------------------------------------------- *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7053
(* Pretty-printers for common types.                                         *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7054
(* ------------------------------------------------------------------------- *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7055
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7056
fun ppChar c = ppWord (charWord c);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7057
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7058
fun ppString s = ppWord (mkWord s);
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7059
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7060
fun ppEscapeString escape = ppMap (escapeString escape) ppString;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7061
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7062
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7063
  val pp = ppString "()";
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7064
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7065
  fun ppUnit () = pp;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7066
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7067
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7068
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7069
  val ppTrue = ppString "true"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7070
  and ppFalse = ppString "false";
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7071
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7072
  fun ppBool b = if b then ppTrue else ppFalse;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7073
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7074
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7075
val ppInt = ppMap Int.toString ppString;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7076
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7077
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7078
  val ppNeg = ppString "~"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7079
  and ppSep = ppString ","
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7080
  and ppZero = ppString "0"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7081
  and ppZeroZero = ppString "00";
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7082
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7083
  fun ppIntBlock i =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7084
      if i < 10 then sequence ppZeroZero (ppInt i)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7085
      else if i < 100 then sequence ppZero (ppInt i)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7086
      else ppInt i;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7087
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7088
  fun ppIntBlocks i =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7089
      if i < 1000 then ppInt i
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7090
      else sequence (ppIntBlocks (i div 1000))
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7091
             (sequence ppSep (ppIntBlock (i mod 1000)));
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7092
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7093
  fun ppPrettyInt i =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7094
      if i < 0 then sequence ppNeg (ppIntBlocks (~i))
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7095
      else ppIntBlocks i;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7096
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7097
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7098
val ppReal = ppMap Real.toString ppString;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7099
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7100
val ppPercent = ppMap percentToString ppString;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7101
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7102
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7103
  val ppLess = ppString "Less"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7104
  and ppEqual = ppString "Equal"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7105
  and ppGreater = ppString "Greater";
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7106
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7107
  fun ppOrder ord =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7108
      case ord of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7109
        LESS => ppLess
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7110
      | EQUAL => ppEqual
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7111
      | GREATER => ppGreater;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7112
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7113
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7114
local
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7115
  val left = mkWord "["
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7116
  and right = mkWord "]"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7117
  and sep = mkWord ",";
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7118
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7119
  fun ppList ppX xs = ppBracket' left right (ppOpList' sep ppX) xs;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7120
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7121
  fun ppStream ppX xs = ppBracket' left right (ppOpStream' sep ppX) xs;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7122
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7123
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7124
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7125
  val ppNone = ppString "-";
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7126
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7127
  fun ppOption ppX xo =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7128
      case xo of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7129
        SOME x => ppX x
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7130
      | NONE => ppNone;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7131
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7132
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7133
local
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7134
  val left = mkWord "("
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7135
  and right = mkWord ")"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7136
  and sep = mkWord ",";
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7137
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7138
  fun ppPair ppA ppB =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7139
      ppBracket' left right (ppOp2' sep ppA ppB);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7140
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7141
  fun ppTriple ppA ppB ppC =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7142
      ppBracket' left right (ppOp3' sep sep ppA ppB ppC);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7143
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7144
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  7145
fun ppException e = ppString (exnMessage e);
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  7146
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7147
(* ------------------------------------------------------------------------- *)
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7148
(* A type of pretty-printers.                                                *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7149
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7150
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7151
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7152
  val ppStepType = ppMap toStringStep ppString;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7153
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7154
  val ppStyle = ppMap toStringStyle ppString;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7155
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7156
  val ppBlockInfo =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7157
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7158
        val sep = mkWord " "
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7159
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7160
        fn Block {style = s, indent = i} =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7161
           program [ppStyle s, ppWord sep, ppInt i]
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7162
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7163
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7164
  val ppWordInfo =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7165
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7166
        val left = mkWord "\""
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7167
        and right = mkWord "\""
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7168
        and escape = {escape = [#"\""]}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7169
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7170
        val pp = ppBracket' left right (ppEscapeString escape)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7171
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7172
        fn Word {word = s, size = n} =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7173
           if size s = n then pp s else ppPair pp ppInt (s,n)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7174
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7175
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7176
  val ppBreakInfo =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7177
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7178
        val sep = mkWord "+"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7179
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7180
        fn Break {size = n, extraIndent = k} =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7181
           if k = 0 then ppInt n else program [ppInt n, ppWord sep, ppInt k]
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7182
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7183
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7184
  fun ppStep step =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7185
      inconsistentBlock 2
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7186
        (ppStepType step ::
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7187
         (case step of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7188
            BeginBlock b =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7189
              [break,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7190
               ppBlockInfo b]
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7191
          | EndBlock => []
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7192
          | AddWord w =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7193
              [break,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7194
               ppWordInfo w]
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7195
          | AddBreak b =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7196
              [break,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7197
               ppBreakInfo b]
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7198
          | AddNewline => []));
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7199
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7200
  val ppPpstream = ppStream ppStep;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7201
end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7202
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7203
(* ------------------------------------------------------------------------- *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7204
(* Pretty-printing infix operators.                                          *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7205
(* ------------------------------------------------------------------------- *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7206
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7207
type token = string;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7208
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7209
datatype assoc =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7210
    LeftAssoc
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7211
  | NonAssoc
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7212
  | RightAssoc;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7213
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7214
datatype infixes =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7215
    Infixes of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7216
      {token : token,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7217
       precedence : int,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7218
       assoc : assoc} list;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7219
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7220
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7221
  fun comparePrecedence (io1,io2) =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7222
      let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7223
        val {token = _, precedence = p1, assoc = _} = io1
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7224
        and {token = _, precedence = p2, assoc = _} = io2
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7225
      in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7226
        Int.compare (p2,p1)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7227
      end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7228
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7229
  fun equalAssoc a a' =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7230
      case a of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7231
        LeftAssoc => (case a' of LeftAssoc => true | _ => false)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7232
      | NonAssoc => (case a' of NonAssoc => true | _ => false)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7233
      | RightAssoc => (case a' of RightAssoc => true | _ => false);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7234
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7235
  fun new t a acc = {tokens = Metis_StringSet.singleton t, assoc = a} :: acc;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7236
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7237
  fun add t a' acc =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7238
      case acc of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7239
        [] => raise Bug "Metis_Print.layerInfixes: null"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7240
      | {tokens = ts, assoc = a} :: acc =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7241
        if equalAssoc a a' then {tokens = Metis_StringSet.add ts t, assoc = a} :: acc
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7242
        else raise Bug "Metis_Print.layerInfixes: mixed assocs";
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7243
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7244
  fun layer ({token = t, precedence = p, assoc = a}, (acc,p')) =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7245
      let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7246
        val acc = if p = p' then add t a acc else new t a acc
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7247
      in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7248
        (acc,p)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7249
      end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7250
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7251
  fun layerInfixes (Infixes ios) =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7252
      case sort comparePrecedence ios of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7253
        [] => []
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7254
      | {token = t, precedence = p, assoc = a} :: ios =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7255
        let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7256
          val acc = new t a []
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7257
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7258
          val (acc,_) = List.foldl layer (acc,p) ios
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7259
        in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7260
          acc
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7261
        end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7262
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7263
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7264
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7265
  fun add ({tokens = ts, assoc = _}, tokens) = Metis_StringSet.union ts tokens;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7266
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7267
  fun tokensLayeredInfixes l = List.foldl add Metis_StringSet.empty l;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7268
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7269
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7270
fun tokensInfixes ios = tokensLayeredInfixes (layerInfixes ios);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7271
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7272
fun destInfixOp dest tokens tm =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7273
    case dest tm of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7274
      NONE => NONE
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7275
    | s as SOME (t,a,b) => if Metis_StringSet.member t tokens then s else NONE;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7276
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7277
fun ppLayeredInfixes dest ppTok {tokens,assoc} ppLower ppSub =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7278
    let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7279
      fun isLayer t = Metis_StringSet.member t tokens
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7280
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7281
      fun ppTerm aligned (tm,r) =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7282
          case dest tm of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7283
            NONE => ppSub (tm,r)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7284
          | SOME (t,a,b) =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7285
            if aligned andalso isLayer t then ppLayer (tm,t,a,b,r)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7286
            else ppLower (tm,t,a,b,r)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7287
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7288
      and ppLeft tm_r =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7289
          let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7290
            val aligned = case assoc of LeftAssoc => true | _ => false
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7291
          in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7292
            ppTerm aligned tm_r
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7293
          end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7294
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7295
      and ppLayer (tm,t,a,b,r) =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7296
          program
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7297
            [ppLeft (a,true),
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7298
             ppTok (tm,t),
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7299
             ppRight (b,r)]
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7300
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7301
      and ppRight tm_r =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7302
          let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7303
            val aligned = case assoc of RightAssoc => true | _ => false
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7304
          in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7305
            ppTerm aligned tm_r
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7306
          end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7307
    in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7308
      fn tm_t_a_b_r as (_,t,_,_,_) =>
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7309
         if isLayer t then inconsistentBlock 0 [ppLayer tm_t_a_b_r]
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7310
         else ppLower tm_t_a_b_r
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7311
    end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7312
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7313
local
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7314
  val leftBrack = mkWord "("
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7315
  and rightBrack = mkWord ")";
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7316
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7317
  fun ppInfixes ops =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7318
      let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7319
        val layers = layerInfixes ops
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7320
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7321
        val toks = tokensLayeredInfixes layers
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7322
      in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7323
        fn dest => fn ppTok => fn ppSub =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7324
           let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7325
             fun destOp tm = destInfixOp dest toks tm
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7326
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7327
             fun ppInfix tm_t_a_b_r = ppLayers layers tm_t_a_b_r
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7328
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7329
             and ppLayers ls (tm,t,a,b,r) =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7330
                 case ls of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7331
                   [] =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7332
                   ppBracket' leftBrack rightBrack ppInfix (tm,t,a,b,false)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7333
                 | l :: ls =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7334
                   let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7335
                     val ppLower = ppLayers ls
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7336
                   in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7337
                     ppLayeredInfixes destOp ppTok l ppLower ppSub (tm,t,a,b,r)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7338
                   end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7339
           in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7340
             fn (tm,r) =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7341
                case destOp tm of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7342
                  SOME (t,a,b) => ppInfix (tm,t,a,b,r)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7343
                | NONE => ppSub (tm,r)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7344
           end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7345
      end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7346
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7347
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7348
(* ------------------------------------------------------------------------- *)
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7349
(* A type of output lines.                                                   *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7350
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7351
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7352
type line = {indent : int, line : string};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7353
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7354
val emptyLine =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7355
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7356
      val indent = 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7357
      and line = ""
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7358
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7359
      {indent = indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7360
       line = line}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7361
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7362
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7363
fun addEmptyLine lines = emptyLine :: lines;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7364
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7365
fun addLine lines indent line = {indent = indent, line = line} :: lines;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7366
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7367
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7368
(* Pretty-printer rendering.                                                 *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7369
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7370
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7371
datatype chunk =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7372
    WordChunk of word
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7373
  | BreakChunk of break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7374
  | FrameChunk of frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7375
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7376
and frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7377
    Frame of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7378
      {block : block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7379
       broken : bool,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7380
       indent : int,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7381
       size : int,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7382
       chunks : chunk list};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7383
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7384
datatype state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7385
    State of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7386
      {lineIndent : int,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7387
       lineSize : int,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7388
       stack : frame list};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7389
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7390
fun blockFrame (Frame {block = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7391
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7392
fun brokenFrame (Frame {broken = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7393
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7394
fun indentFrame (Frame {indent = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7395
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7396
fun sizeFrame (Frame {size = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7397
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7398
fun chunksFrame (Frame {chunks = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7399
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7400
fun styleFrame frame = styleBlock (blockFrame frame);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7401
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7402
fun isConsistentFrame frame = isConsistentBlock (blockFrame frame);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7403
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7404
fun breakingFrame frame = isConsistentFrame frame andalso brokenFrame frame;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7405
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7406
fun sizeChunk chunk =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7407
    case chunk of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7408
      WordChunk w => sizeWord w
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7409
    | BreakChunk b => sizeBreak b
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7410
    | FrameChunk f => sizeFrame f;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7411
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7412
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7413
  fun add (c,acc) = sizeChunk c + acc;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7414
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7415
  fun sizeChunks cs = List.foldl add 0 cs;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7416
end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7417
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7418
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7419
  fun flattenChunks acc chunks =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7420
      case chunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7421
        [] => acc
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7422
      | chunk :: chunks => flattenChunk acc chunk chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7423
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7424
  and flattenChunk acc chunk chunks =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7425
      case chunk of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7426
        WordChunk w => flattenChunks (renderWord w :: acc) chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7427
      | BreakChunk b => flattenChunks (renderBreak b :: acc) chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7428
      | FrameChunk f => flattenFrame acc f chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7429
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7430
  and flattenFrame acc frame chunks =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7431
      flattenChunks acc (chunksFrame frame @ chunks);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7432
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7433
  fun renderChunks chunks = String.concat (flattenChunks [] chunks);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7434
end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7435
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7436
fun addChunksLine lines indent chunks =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7437
    addLine lines indent (renderChunks chunks);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7438
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7439
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7440
  fun add baseIndent ((extraIndent,chunks),lines) =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7441
      addChunksLine lines (baseIndent + extraIndent) chunks;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7442
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7443
  fun addIndentChunksLines lines baseIndent indent_chunks =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7444
      List.foldl (add baseIndent) lines indent_chunks;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7445
end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7446
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7447
fun isEmptyFrame frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7448
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7449
      val chunks = chunksFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7450
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7451
      val empty = List.null chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7452
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7453
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7454
      val () =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7455
          if not empty orelse sizeFrame frame = 0 then ()
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7456
          else raise Bug "Metis_Print.isEmptyFrame: bad size"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7457
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7458
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7459
      empty
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7460
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7461
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7462
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7463
  fun breakInconsistent blockIndent =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7464
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7465
        fun break chunks =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7466
            case chunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7467
              [] => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7468
            | chunk :: chunks =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7469
              case chunk of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7470
                BreakChunk b =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7471
                let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7472
                  val pre = chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7473
                  and indent = blockIndent + extraIndentBreak b
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7474
                  and post = []
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7475
                in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7476
                  SOME (pre,indent,post)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7477
                end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7478
              | _ =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7479
                case break chunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7480
                  SOME (pre,indent,post) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7481
                  let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7482
                    val post = chunk :: post
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7483
                  in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7484
                    SOME (pre,indent,post)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7485
                  end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7486
                | NONE => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7487
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7488
        break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7489
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7490
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7491
  fun breakConsistent blockIndent =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7492
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7493
        fun break indent_chunks chunks =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7494
            case breakInconsistent blockIndent chunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7495
              NONE => (chunks,indent_chunks)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7496
            | SOME (pre,indent,post) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7497
              break ((indent,post) :: indent_chunks) pre
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7498
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7499
        break []
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7500
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7501
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7502
  fun breakFrame frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7503
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7504
        val Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7505
              {block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7506
               broken = _,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7507
               indent = _,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7508
               size = _,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7509
               chunks} = frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7510
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7511
        val blockIndent = indentBlock block
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7512
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7513
        case breakInconsistent blockIndent chunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7514
          NONE => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7515
        | SOME (pre,indent,post) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7516
          let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7517
            val broken = true
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7518
            and size = sizeChunks post
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7519
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7520
            val frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7521
                Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7522
                  {block = block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7523
                   broken = broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7524
                   indent = indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7525
                   size = size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7526
                   chunks = post}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7527
          in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7528
            case styleBlock block of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7529
              Inconsistent =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7530
              let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7531
                val indent_chunks = []
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7532
              in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7533
                SOME (pre,indent_chunks,frame)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7534
              end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7535
            | Consistent =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7536
              let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7537
                val (pre,indent_chunks) = breakConsistent blockIndent pre
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7538
              in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7539
                SOME (pre,indent_chunks,frame)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7540
              end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7541
          end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7542
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7543
end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7544
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7545
fun removeChunksFrame frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7546
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7547
      val Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7548
            {block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7549
             broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7550
             indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7551
             size = _,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7552
             chunks} = frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7553
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7554
      if broken andalso List.null chunks then NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7555
      else
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7556
        let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7557
          val frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7558
              Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7559
                {block = block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7560
                 broken = true,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7561
                 indent = indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7562
                 size = 0,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7563
                 chunks = []}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7564
        in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7565
          SOME (chunks,frame)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7566
        end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7567
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7568
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7569
val removeChunksFrames =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7570
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7571
      fun remove frames =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7572
          case frames of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7573
            [] =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7574
            let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7575
              val chunks = []
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7576
              and frames = NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7577
              and indent = 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7578
            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7579
              (chunks,frames,indent)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7580
            end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7581
          | top :: rest =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7582
            let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7583
              val (chunks,rest',indent) = remove rest
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7584
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7585
              val indent = indent + indentFrame top
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7586
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7587
              val (chunks,top') =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7588
                  case removeChunksFrame top of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7589
                    NONE => (chunks,NONE)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7590
                  | SOME (topChunks,top) => (topChunks @ chunks, SOME top)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7591
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7592
              val frames' =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7593
                  case (top',rest') of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7594
                    (NONE,NONE) => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7595
                  | (SOME top, NONE) => SOME (top :: rest)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7596
                  | (NONE, SOME rest) => SOME (top :: rest)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7597
                  | (SOME top, SOME rest) => SOME (top :: rest)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7598
            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7599
              (chunks,frames',indent)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7600
            end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7601
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7602
      fn frames =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7603
         let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7604
           val (chunks,frames',indent) = remove frames
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7605
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7606
           val frames = Option.getOpt (frames',frames)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7607
         in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7608
           (chunks,frames,indent)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7609
         end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7610
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7611
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7612
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7613
  fun breakUp lines lineIndent frames =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7614
      case frames of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7615
        [] => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7616
      | frame :: frames =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7617
        case breakUp lines lineIndent frames of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7618
          SOME (lines_indent,lineSize,frames) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7619
          let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7620
            val lineSize = lineSize + sizeFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7621
            and frames = frame :: frames
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7622
          in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7623
            SOME (lines_indent,lineSize,frames)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7624
          end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7625
        | NONE =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7626
          case breakFrame frame of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7627
            NONE => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7628
          | SOME (frameChunks,indent_chunks,frame) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7629
            let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7630
              val (chunks,frames,indent) = removeChunksFrames frames
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7631
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7632
              val chunks = frameChunks @ chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7633
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7634
              val lines = addChunksLine lines lineIndent chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7635
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7636
              val lines = addIndentChunksLines lines indent indent_chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7637
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7638
              val lineIndent = indent + indentFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7639
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7640
              val lineSize = sizeFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7641
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7642
              val frames = frame :: frames
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7643
            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7644
              SOME ((lines,lineIndent),lineSize,frames)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7645
            end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7646
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7647
  fun breakInsideChunk chunk =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7648
      case chunk of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7649
        WordChunk _ => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7650
      | BreakChunk _ => raise Bug "Metis_Print.breakInsideChunk"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7651
      | FrameChunk frame =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7652
        case breakFrame frame of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7653
          SOME (pathChunks,indent_chunks,frame) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7654
          let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7655
            val pathIndent = 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7656
            and breakIndent = indentFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7657
          in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7658
            SOME (pathChunks,pathIndent,indent_chunks,breakIndent,frame)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7659
          end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7660
        | NONE => breakInsideFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7661
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7662
  and breakInsideChunks chunks =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7663
      case chunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7664
        [] => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7665
      | chunk :: chunks =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7666
        case breakInsideChunk chunk of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7667
          SOME (pathChunks,pathIndent,indent_chunks,breakIndent,frame) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7668
          let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7669
            val pathChunks = pathChunks @ chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7670
            and chunks = [FrameChunk frame]
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7671
          in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7672
            SOME (pathChunks,pathIndent,indent_chunks,breakIndent,chunks)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7673
          end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7674
        | NONE =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7675
          case breakInsideChunks chunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7676
            SOME (pathChunks,pathIndent,indent_chunks,breakIndent,chunks) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7677
            let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7678
              val chunks = chunk :: chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7679
            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7680
              SOME (pathChunks,pathIndent,indent_chunks,breakIndent,chunks)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7681
            end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7682
          | NONE => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7683
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7684
  and breakInsideFrame frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7685
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7686
        val Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7687
              {block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7688
               broken = _,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7689
               indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7690
               size = _,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7691
               chunks} = frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7692
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7693
        case breakInsideChunks chunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7694
          SOME (pathChunks,pathIndent,indent_chunks,breakIndent,chunks) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7695
          let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7696
            val pathIndent = pathIndent + indent
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7697
            and broken = true
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7698
            and size = sizeChunks chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7699
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7700
            val frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7701
                Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7702
                  {block = block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7703
                   broken = broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7704
                   indent = indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7705
                   size = size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7706
                   chunks = chunks}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7707
          in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7708
            SOME (pathChunks,pathIndent,indent_chunks,breakIndent,frame)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7709
          end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7710
        | NONE => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7711
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7712
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7713
  fun breakInside lines lineIndent frames =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7714
      case frames of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7715
        [] => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7716
      | frame :: frames =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7717
        case breakInsideFrame frame of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7718
          SOME (pathChunks,pathIndent,indent_chunks,breakIndent,frame) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7719
          let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7720
            val (chunks,frames,indent) = removeChunksFrames frames
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7721
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7722
            val chunks = pathChunks @ chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7723
            and indent = indent + pathIndent
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7724
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7725
            val lines = addChunksLine lines lineIndent chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7726
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7727
            val lines = addIndentChunksLines lines indent indent_chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7728
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7729
            val lineIndent = indent + breakIndent
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7730
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7731
            val lineSize = sizeFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7732
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7733
            val frames = frame :: frames
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7734
          in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7735
            SOME ((lines,lineIndent),lineSize,frames)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7736
          end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7737
        | NONE =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7738
          case breakInside lines lineIndent frames of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7739
            SOME (lines_indent,lineSize,frames) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7740
            let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7741
              val lineSize = lineSize + sizeFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7742
              and frames = frame :: frames
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7743
            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7744
              SOME (lines_indent,lineSize,frames)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7745
            end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7746
          | NONE => NONE;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7747
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7748
  fun breakFrames lines lineIndent frames =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7749
      case breakUp lines lineIndent frames of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7750
        SOME ((lines,lineIndent),lineSize,frames) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7751
        SOME (lines,lineIndent,lineSize,frames)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7752
      | NONE =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7753
        case breakInside lines lineIndent frames of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7754
          SOME ((lines,lineIndent),lineSize,frames) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7755
          SOME (lines,lineIndent,lineSize,frames)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7756
        | NONE => NONE;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7757
end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7758
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7759
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7760
fun checkChunk chunk =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7761
    case chunk of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7762
      WordChunk t => (false, sizeWord t)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7763
    | BreakChunk b => (false, sizeBreak b)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7764
    | FrameChunk b => checkFrame b
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7765
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7766
and checkChunks chunks =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7767
    case chunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7768
      [] => (false,0)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7769
    | chunk :: chunks =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7770
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7771
        val (bk,sz) = checkChunk chunk
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7772
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7773
        val (bk',sz') = checkChunks chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7774
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7775
        (bk orelse bk', sz + sz')
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7776
      end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7777
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7778
and checkFrame frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7779
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7780
      val Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7781
            {block = _,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7782
             broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7783
             indent = _,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7784
             size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7785
             chunks} = frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7786
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7787
      val (bk,sz) = checkChunks chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7788
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7789
      val () =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7790
          if size = sz then ()
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7791
          else raise Bug "Metis_Print.checkFrame: wrong size"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7792
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7793
      val () =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7794
          if broken orelse not bk then ()
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7795
          else raise Bug "Metis_Print.checkFrame: deep broken frame"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7796
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7797
      (broken,size)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7798
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7799
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7800
fun checkFrames frames =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7801
    case frames of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7802
      [] => (true,0)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7803
    | frame :: frames =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7804
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7805
        val (bk,sz) = checkFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7806
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7807
        val (bk',sz') = checkFrames frames
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7808
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7809
        val () =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7810
            if bk' orelse not bk then ()
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7811
            else raise Bug "Metis_Print.checkFrame: broken stack frame"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7812
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7813
        (bk, sz + sz')
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7814
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7815
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7816
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7817
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7818
fun checkState state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7819
    (let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7820
       val State {lineIndent,lineSize,stack} = state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7821
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7822
       val () =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7823
           if not (List.null stack) then ()
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7824
           else raise Error "no stack"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7825
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7826
       val (_,sz) = checkFrames stack
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7827
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7828
       val () =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7829
           if lineSize = sz then ()
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7830
           else raise Error "wrong lineSize"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7831
     in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7832
       ()
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7833
     end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7834
     handle Error err => raise Bug err)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7835
    handle Bug bug => raise Bug ("Metis_Print.checkState: " ^ bug);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7836
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7837
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7838
fun isEmptyState state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7839
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7840
      val State {lineSize,stack,...} = state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7841
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7842
      lineSize = 0 andalso List.all isEmptyFrame stack
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7843
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7844
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7845
fun isFinalState state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7846
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7847
      val State {stack,...} = state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7848
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7849
      case stack of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7850
        [] => raise Bug "Metis_Print.isFinalState: empty stack"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7851
      | [frame] => isEmptyFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7852
      | _ :: _ :: _ => false
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7853
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7854
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7855
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7856
  val initialBlock =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7857
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7858
        val indent = 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7859
        and style = Inconsistent
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7860
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7861
        Block
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7862
          {indent = indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7863
           style = style}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7864
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7865
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7866
  val initialFrame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7867
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7868
        val block = initialBlock
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7869
        and broken = false
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7870
        and indent = 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7871
        and size = 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7872
        and chunks = []
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7873
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7874
        Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7875
          {block = block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7876
           broken = broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7877
           indent = indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7878
           size = size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7879
           chunks = chunks}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7880
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7881
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7882
  val initialState =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7883
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7884
        val lineIndent = 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7885
        and lineSize = 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7886
        and stack = [initialFrame]
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7887
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7888
        State
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7889
          {lineIndent = lineIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7890
           lineSize = lineSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7891
           stack = stack}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7892
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7893
end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7894
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7895
fun normalizeState lineLength lines state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7896
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7897
      val State {lineIndent,lineSize,stack} = state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7898
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7899
      val within =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7900
          case lineLength of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7901
            NONE => true
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7902
          | SOME len => lineIndent + lineSize <= len
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7903
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7904
      if within then (lines,state)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7905
      else
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7906
        case breakFrames lines lineIndent stack of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7907
          NONE => (lines,state)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7908
        | SOME (lines,lineIndent,lineSize,stack) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7909
          let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7910
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7911
            val () = checkState state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7912
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7913
            val state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7914
                State
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7915
                  {lineIndent = lineIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7916
                   lineSize = lineSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7917
                   stack = stack}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7918
          in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7919
            normalizeState lineLength lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7920
          end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7921
    end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7922
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7923
    handle Bug bug => raise Bug ("Metis_Print.normalizeState:\n" ^ bug)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7924
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7925
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7926
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7927
  fun executeBeginBlock block lines state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7928
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7929
        val State {lineIndent,lineSize,stack} = state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7930
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7931
        val broken = false
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7932
        and indent = indentBlock block
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7933
        and size = 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7934
        and chunks = []
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7935
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7936
        val frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7937
            Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7938
              {block = block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7939
               broken = broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7940
               indent = indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7941
               size = size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7942
               chunks = chunks}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7943
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7944
        val stack = frame :: stack
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7945
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7946
        val state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7947
            State
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7948
              {lineIndent = lineIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7949
               lineSize = lineSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7950
               stack = stack}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7951
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7952
        (lines,state)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7953
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7954
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7955
  fun executeEndBlock lines state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7956
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7957
        val State {lineIndent,lineSize,stack} = state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7958
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7959
        val (lineSize,stack) =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7960
            case stack of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7961
              [] => raise Bug "Metis_Print.executeEndBlock: empty stack"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7962
            | topFrame :: stack =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7963
              let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7964
                val Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7965
                      {block = topBlock,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7966
                       broken = topBroken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7967
                       indent = topIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7968
                       size = topSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7969
                       chunks = topChunks} = topFrame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7970
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7971
                val (lineSize,topSize,topChunks,topFrame) =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7972
                    case topChunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7973
                      BreakChunk break :: chunks =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7974
                      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7975
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7976
                        val () =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7977
                            let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7978
                              val mesg =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7979
                                  "ignoring a break at the end of a " ^
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7980
                                  "pretty-printing block"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7981
                            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7982
                              warn mesg
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7983
                            end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7984
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7985
                        val n = sizeBreak break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7986
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7987
                        val lineSize = lineSize - n
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7988
                        and topSize = topSize - n
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7989
                        and topChunks = chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7990
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7991
                        val topFrame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7992
                            Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7993
                              {block = topBlock,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7994
                               broken = topBroken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7995
                               indent = topIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7996
                               size = topSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7997
                               chunks = topChunks}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7998
                      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7999
                        (lineSize,topSize,topChunks,topFrame)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8000
                      end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8001
                    | _ => (lineSize,topSize,topChunks,topFrame)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8002
              in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8003
                if List.null topChunks then (lineSize,stack)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8004
                else
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8005
                  case stack of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8006
                    [] => raise Error "Metis_Print.execute: too many end blocks"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8007
                  | frame :: stack =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8008
                    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8009
                      val Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8010
                            {block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8011
                             broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8012
                             indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8013
                             size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8014
                             chunks} = frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8015
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8016
                      val size = size + topSize
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8017
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8018
                      val chunk = FrameChunk topFrame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8019
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8020
                      val chunks = chunk :: chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8021
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8022
                      val frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8023
                          Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8024
                            {block = block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8025
                             broken = broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8026
                             indent = indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8027
                             size = size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8028
                             chunks = chunks}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8029
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8030
                      val stack = frame :: stack
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8031
                    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8032
                      (lineSize,stack)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8033
                    end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8034
              end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8035
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8036
        val state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8037
            State
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8038
              {lineIndent = lineIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8039
               lineSize = lineSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8040
               stack = stack}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8041
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8042
        (lines,state)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8043
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8044
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8045
  fun executeAddWord lineLength word lines state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8046
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8047
        val State {lineIndent,lineSize,stack} = state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8048
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8049
        val n = sizeWord word
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8050
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8051
        val lineSize = lineSize + n
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8052
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8053
        val stack =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8054
            case stack of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8055
              [] => raise Bug "Metis_Print.executeAddWord: empty stack"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8056
            | frame :: stack =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8057
              let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8058
                val Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8059
                      {block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8060
                       broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8061
                       indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8062
                       size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8063
                       chunks} = frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8064
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8065
                val size = size + n
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8066
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8067
                val chunk = WordChunk word
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8068
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8069
                val chunks = chunk :: chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8070
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8071
                val frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8072
                    Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8073
                      {block = block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8074
                       broken = broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8075
                       indent = indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8076
                       size = size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8077
                       chunks = chunks}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8078
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8079
                val stack = frame :: stack
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8080
              in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8081
                stack
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8082
              end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8083
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8084
        val state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8085
            State
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8086
              {lineIndent = lineIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8087
               lineSize = lineSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8088
               stack = stack}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8089
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8090
        normalizeState lineLength lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8091
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8092
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8093
  fun executeAddBreak lineLength break lines state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8094
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8095
        val State {lineIndent,lineSize,stack} = state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8096
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8097
        val (topFrame,restFrames) =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8098
            case stack of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8099
              [] => raise Bug "Metis_Print.executeAddBreak: empty stack"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8100
            | topFrame :: restFrames => (topFrame,restFrames)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8101
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8102
        val Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8103
              {block = topBlock,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8104
               broken = topBroken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8105
               indent = topIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8106
               size = topSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8107
               chunks = topChunks} = topFrame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8108
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8109
        case topChunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8110
          [] => (lines,state)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8111
        | topChunk :: restTopChunks =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8112
          let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8113
            val (topChunks,n) =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8114
                case topChunk of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8115
                  BreakChunk break' =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8116
                  let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8117
                    val break = appendBreak break' break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8118
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8119
                    val chunk = BreakChunk break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8120
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8121
                    val topChunks = chunk :: restTopChunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8122
                    and n = sizeBreak break - sizeBreak break'
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8123
                  in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8124
                    (topChunks,n)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8125
                  end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8126
                | _ =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8127
                  let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8128
                    val chunk = BreakChunk break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8129
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8130
                    val topChunks = chunk :: topChunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8131
                    and n = sizeBreak break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8132
                  in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8133
                    (topChunks,n)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8134
                  end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8135
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8136
            val lineSize = lineSize + n
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8137
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8138
            val topSize = topSize + n
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8139
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8140
            val topFrame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8141
                Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8142
                  {block = topBlock,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8143
                   broken = topBroken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8144
                   indent = topIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8145
                   size = topSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8146
                   chunks = topChunks}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8147
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8148
            val stack = topFrame :: restFrames
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8149
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8150
            val state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8151
                State
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8152
                  {lineIndent = lineIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8153
                   lineSize = lineSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8154
                   stack = stack}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8155
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8156
            val lineLength =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8157
                if breakingFrame topFrame then SOME ~1 else lineLength
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8158
          in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8159
            normalizeState lineLength lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8160
          end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8161
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8162
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8163
  fun executeBigBreak lines state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8164
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8165
        val lineLength = SOME ~1
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8166
        and break = mkBreak 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8167
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8168
        executeAddBreak lineLength break lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8169
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8170
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8171
  fun executeAddNewline lineLength lines state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8172
      if isEmptyState state then (addEmptyLine lines, state)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8173
      else executeBigBreak lines state;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8174
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8175
  fun executeEof lineLength lines state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8176
      if isFinalState state then (lines,state)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8177
      else
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8178
        let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8179
          val (lines,state) = executeBigBreak lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8180
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8181
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8182
          val () =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8183
              if isFinalState state then ()
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8184
              else raise Bug "Metis_Print.executeEof: not a final state"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8185
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8186
        in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8187
          (lines,state)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8188
        end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8189
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8190
  fun render {lineLength} =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8191
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8192
        fun execute step state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8193
            let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8194
              val lines = []
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8195
            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8196
              case step of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8197
                BeginBlock block => executeBeginBlock block lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8198
              | EndBlock => executeEndBlock lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8199
              | AddWord word => executeAddWord lineLength word lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8200
              | AddBreak break => executeAddBreak lineLength break lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8201
              | AddNewline => executeAddNewline lineLength lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8202
            end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8203
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8204
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8205
        val execute = fn step => fn state =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8206
            let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8207
              val (lines,state) = execute step state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8208
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8209
              val () = checkState state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8210
            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8211
              (lines,state)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8212
            end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8213
            handle Bug bug =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8214
              raise Bug ("Metis_Print.execute: after " ^ toStringStep step ^
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8215
                         " command:\n" ^ bug)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8216
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8217
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8218
        fun final state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8219
            let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8220
              val lines = []
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8221
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8222
              val (lines,state) = executeEof lineLength lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8223
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8224
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8225
              val () = checkState state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8226
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8227
            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8228
              if List.null lines then Metis_Stream.Nil else Metis_Stream.singleton lines
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8229
            end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8230
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8231
            handle Bug bug => raise Bug ("Metis_Print.final: " ^ bug)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8232
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8233
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8234
        fn pps =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8235
           let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8236
             val lines = Metis_Stream.maps execute final initialState pps
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8237
           in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8238
             revConcat lines
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8239
           end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8240
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8241
end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8242
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8243
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8244
  fun inc {indent,line} acc = line :: nSpaces indent :: acc;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8245
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8246
  fun incn (indent_line,acc) = inc indent_line ("\n" :: acc);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8247
in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8248
  fun toStringWithLineLength len ppA a =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8249
      case render len (ppA a) of
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8250
        Metis_Stream.Nil => ""
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8251
      | Metis_Stream.Cons (h,t) =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8252
        let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8253
          val lines = Metis_Stream.foldl incn (inc h []) (t ())
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8254
        in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8255
          String.concat (List.rev lines)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8256
        end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8257
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8258
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8259
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8260
  fun renderLine {indent,line} = nSpaces indent ^ line ^ "\n";
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8261
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8262
  fun toStreamWithLineLength len ppA a =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8263
      Metis_Stream.map renderLine (render len (ppA a));
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8264
end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8265
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8266
fun toLine ppA a = toStringWithLineLength {lineLength = NONE} ppA a;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8267
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8268
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8269
(* Pretty-printer rendering with a global line length.                       *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8270
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8271
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8272
val lineLength = Unsynchronized.ref initialLineLength;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8273
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8274
fun toString ppA a =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8275
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8276
      val len = {lineLength = SOME (!lineLength)}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8277
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8278
      toStringWithLineLength len ppA a
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8279
    end;
43269
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  8280
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  8281
fun toStream ppA a =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8282
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8283
      val len = {lineLength = SOME (!lineLength)}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8284
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8285
      toStreamWithLineLength len ppA a
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8286
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8287
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8288
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8289
  val sep = mkWord " =";
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8290
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8291
  fun trace ppX nameX x =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8292
      Metis_Useful.trace (toString (ppOp2' sep ppString ppX) (nameX,x) ^ "\n");
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8293
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8294
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8295
end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8296
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8297
(**** Original file: src/Parse.sig ****)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8298
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8299
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8300
(* PARSING                                                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8301
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8302
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8303
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8304
signature Metis_Parse =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8305
sig
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8306
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8307
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8308
(* A "cannot parse" exception.                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8309
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8310
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8311
exception NoParse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8312
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8313
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8314
(* Recursive descent parsing combinators.                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8315
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8316
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8317
(*
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8318
  Recommended fixities:
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8319
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8320
  infixr 9 >>++
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8321
  infixr 8 ++
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8322
  infixr 7 >>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8323
  infixr 6 ||
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8324
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8325
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8326
val error : 'a -> 'b * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8327
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8328
val ++ : ('a -> 'b * 'a) * ('a -> 'c * 'a) -> 'a -> ('b * 'c) * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8329
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8330
val >> : ('a -> 'b * 'a) * ('b -> 'c) -> 'a -> 'c * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8331
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8332
val >>++ : ('a -> 'b * 'a) * ('b -> 'a -> 'c * 'a) -> 'a -> 'c * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8333
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8334
val || : ('a -> 'b * 'a) * ('a -> 'b * 'a) -> 'a -> 'b * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8335
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8336
val first : ('a -> 'b * 'a) list -> 'a -> 'b * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8337
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8338
val mmany : ('s -> 'a -> 's * 'a) -> 's -> 'a -> 's * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8339
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8340
val many : ('a -> 'b * 'a) -> 'a -> 'b list * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8341
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8342
val atLeastOne : ('a -> 'b * 'a) -> 'a -> 'b list * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8343
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8344
val nothing : 'a -> unit * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8345
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8346
val optional : ('a -> 'b * 'a) -> 'a -> 'b option * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8347
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8348
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8349
(* Metis_Stream-based parsers.                                                     *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8350
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8351
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8352
type ('a,'b) parser = 'a Metis_Stream.stream -> 'b * 'a Metis_Stream.stream
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8353
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8354
val maybe : ('a -> 'b option) -> ('a,'b) parser
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8355
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8356
val finished : ('a,unit) parser
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8357
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8358
val some : ('a -> bool) -> ('a,'a) parser
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8359
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8360
val any : ('a,'a) parser
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8361
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8362
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8363
(* Parsing whole streams.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8364
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8365
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8366
val fromStream : ('a,'b) parser -> 'a Metis_Stream.stream -> 'b
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8367
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8368
val fromList : ('a,'b) parser -> 'a list -> 'b
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8369
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8370
val everything : ('a, 'b list) parser -> 'a Metis_Stream.stream -> 'b Metis_Stream.stream
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8371
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8372
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8373
(* Parsing lines of text.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8374
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8375
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8376
val initialize :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8377
    {lines : string Metis_Stream.stream} ->
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8378
    {chars : char list Metis_Stream.stream,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8379
     parseErrorLocation : unit -> string}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8380
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8381
val exactChar : char -> (char,unit) parser
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8382
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8383
val exactCharList : char list -> (char,unit) parser
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8384
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8385
val exactString : string -> (char,unit) parser
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8386
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8387
val escapeString : {escape : char list} -> (char,string) parser
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8388
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8389
val manySpace : (char,unit) parser
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8390
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8391
val atLeastOneSpace : (char,unit) parser
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8392
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8393
val fromString : (char,'a) parser -> string -> 'a
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8394
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8395
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8396
(* Infix operators.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8397
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8398
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8399
val parseInfixes :
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8400
    Metis_Print.infixes ->
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8401
    (Metis_Print.token * 'a * 'a -> 'a) -> ('b,Metis_Print.token) parser ->
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8402
    ('b,'a) parser -> ('b,'a) parser
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8403
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8404
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8405
(* Quotations.                                                               *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8406
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8407
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8408
type 'a quotation = 'a frag list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8409
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8410
val parseQuotation : ('a -> string) -> (string -> 'b) -> 'a quotation -> 'b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8411
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8412
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8413
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8414
(**** Original file: src/Parse.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8415
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8416
(* ========================================================================= *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8417
(* PARSING                                                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8418
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8419
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8420
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8421
structure Metis_Parse :> Metis_Parse =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8422
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8423
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8424
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8425
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8426
infixr 9 >>++
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8427
infixr 8 ++
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8428
infixr 7 >>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8429
infixr 6 ||
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8430
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8431
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8432
(* A "cannot parse" exception.                                               *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8433
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8434
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8435
exception NoParse;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8436
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8437
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8438
(* Recursive descent parsing combinators.                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8439
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8440
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8441
val error : 'a -> 'b * 'a = fn _ => raise NoParse;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8443
fun op ++ (parser1,parser2) input =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8444
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8445
      val (result1,input) = parser1 input
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8446
      val (result2,input) = parser2 input
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8447
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8448
      ((result1,result2),input)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8449
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8450
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8451
fun op >> (parser : 'a -> 'b * 'a, treatment) input =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8452
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8453
      val (result,input) = parser input
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8454
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8455
      (treatment result, input)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8456
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8457
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8458
fun op >>++ (parser,treatment) input =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8459
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8460
      val (result,input) = parser input
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8461
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8462
      treatment result input
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8463
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8464
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8465
fun op || (parser1,parser2) input =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8466
    parser1 input handle NoParse => parser2 input;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8467
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8468
fun first [] _ = raise NoParse
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8469
  | first (parser :: parsers) input = (parser || first parsers) input;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8470
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8471
fun mmany parser state input =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8472
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8473
      val (state,input) = parser state input
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8474
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8475
      mmany parser state input
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8476
    end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8477
    handle NoParse => (state,input);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8478
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8479
fun many parser =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8480
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8481
      fun sparser l = parser >> (fn x => x :: l)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8482
    in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8483
      mmany sparser [] >> List.rev
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8484
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8485
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8486
fun atLeastOne p = (p ++ many p) >> op::;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8487
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8488
fun nothing input = ((),input);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8489
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8490
fun optional p = (p >> SOME) || (nothing >> K NONE);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8491
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8492
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8493
(* Metis_Stream-based parsers.                                                     *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8494
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8495
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8496
type ('a,'b) parser = 'a Metis_Stream.stream -> 'b * 'a Metis_Stream.stream
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8497
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8498
fun maybe p Metis_Stream.Nil = raise NoParse
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8499
  | maybe p (Metis_Stream.Cons (h,t)) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8500
    case p h of SOME r => (r, t ()) | NONE => raise NoParse;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8501
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8502
fun finished Metis_Stream.Nil = ((), Metis_Stream.Nil)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8503
  | finished (Metis_Stream.Cons _) = raise NoParse;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8504
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8505
fun some p = maybe (fn x => if p x then SOME x else NONE);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8506
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8507
fun any input = some (K true) input;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8508
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8509
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8510
(* Parsing whole streams.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8511
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8512
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8513
fun fromStream parser input =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8514
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8515
      val (res,_) = (parser ++ finished >> fst) input
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8516
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8517
      res
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8518
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8519
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8520
fun fromList parser l = fromStream parser (Metis_Stream.fromList l);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8521
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8522
fun everything parser =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8523
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8524
      fun parserOption input =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8525
          SOME (parser input)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8526
          handle e as NoParse => if Metis_Stream.null input then NONE else raise e
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8527
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8528
      fun parserList input =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8529
          case parserOption input of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8530
            NONE => Metis_Stream.Nil
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8531
          | SOME (result,input) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8532
            Metis_Stream.append (Metis_Stream.fromList result) (fn () => parserList input)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8533
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8534
      parserList
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8535
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8536
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8537
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8538
(* Parsing lines of text.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8539
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8540
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8541
fun initialize {lines} =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8542
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8543
      val lastLine = Unsynchronized.ref (~1,"","","")
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8544
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8545
      val chars =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8546
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8547
            fun saveLast line =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8548
                let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8549
                  val Unsynchronized.ref (n,_,l2,l3) = lastLine
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8550
                  val () = lastLine := (n + 1, l2, l3, line)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8551
                in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8552
                  String.explode line
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8553
                end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8554
          in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8555
            Metis_Stream.memoize (Metis_Stream.map saveLast lines)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8556
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8557
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8558
      fun parseErrorLocation () =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8559
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8560
            val Unsynchronized.ref (n,l1,l2,l3) = lastLine
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8561
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8562
            (if n <= 0 then "at start"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8563
             else "around line " ^ Int.toString n) ^
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8564
            chomp (":\n" ^ l1 ^ l2 ^ l3)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8565
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8566
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8567
      {chars = chars,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8568
       parseErrorLocation = parseErrorLocation}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8569
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8570
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8571
fun exactChar (c : char) = some (equal c) >> K ();
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8572
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8573
fun exactCharList cs =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8574
    case cs of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8575
      [] => nothing
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8576
    | c :: cs => (exactChar c ++ exactCharList cs) >> snd;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8577
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8578
fun exactString s = exactCharList (String.explode s);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8579
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8580
fun escapeString {escape} =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8581
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8582
      fun isEscape c = mem c escape
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8583
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8584
      fun isNormal c =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8585
          case c of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8586
            #"\\" => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8587
          | #"\n" => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8588
          | #"\t" => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8589
          | _ => not (isEscape c)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8590
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8591
      val escapeParser =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8592
          (exactChar #"\\" >> K #"\\") ||
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8593
          (exactChar #"n" >> K #"\n") ||
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8594
          (exactChar #"t" >> K #"\t") ||
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8595
          some isEscape
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8596
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8597
      val charParser =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8598
          ((exactChar #"\\" ++ escapeParser) >> snd) ||
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8599
          some isNormal
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8600
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8601
      many charParser >> String.implode
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8602
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8603
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8604
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8605
  val isSpace = Char.isSpace;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8606
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8607
  val space = some isSpace;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8608
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8609
  val manySpace = many space >> K ();
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8610
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8611
  val atLeastOneSpace = atLeastOne space >> K ();
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8612
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8613
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8614
fun fromString parser s = fromList parser (String.explode s);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8615
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8616
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8617
(* Infix operators.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8618
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8619
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8620
fun parseLayeredInfixes {tokens,assoc} mk tokParser subParser =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8621
    let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8622
      fun layerTokParser inp =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8623
          let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8624
            val tok_rest as (tok,_) = tokParser inp
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8625
          in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8626
            if Metis_StringSet.member tok tokens then tok_rest
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8627
            else raise NoParse
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8628
          end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8629
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8630
      fun layerMk (x,txs) =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8631
          case assoc of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8632
            Metis_Print.LeftAssoc =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8633
            let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8634
              fun inc ((t,y),z) = mk (t,z,y)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8635
            in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8636
              List.foldl inc x txs
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8637
            end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8638
          | Metis_Print.NonAssoc =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8639
            (case txs of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8640
               [] => x
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8641
             | [(t,y)] => mk (t,x,y)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8642
             | _ => raise NoParse)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8643
          | Metis_Print.RightAssoc =>
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8644
            (case List.rev txs of
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8645
               [] => x
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8646
             | tx :: txs =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8647
               let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8648
                 fun inc ((t,y),(u,z)) = (t, mk (u,y,z))
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8649
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8650
                 val (t,y) = List.foldl inc tx txs
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8651
               in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8652
                 mk (t,x,y)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8653
               end)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8654
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8655
      val layerParser = subParser ++ many (layerTokParser ++ subParser)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8656
    in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8657
      layerParser >> layerMk
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8658
    end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8659
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8660
fun parseInfixes ops =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8661
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8662
      val layeredOps = Metis_Print.layerInfixes ops
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8663
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8664
      val iparsers = List.map parseLayeredInfixes layeredOps
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8665
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8666
      fn mk => fn tokParser => fn subParser =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8667
         List.foldr (fn (p,sp) => p mk tokParser sp) subParser iparsers
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8668
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8669
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8670
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8671
(* Quotations.                                                               *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8672
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8673
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8674
type 'a quotation = 'a frag list;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8675
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8676
fun parseQuotation printer parser quote =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8677
  let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8678
    fun expand (QUOTE q, s) = s ^ q
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8679
      | expand (ANTIQUOTE a, s) = s ^ printer a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8680
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8681
    val string = List.foldl expand "" quote
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8682
  in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8683
    parser string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8684
  end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8685
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8686
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8687
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8688
(**** Original file: src/Name.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8689
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8690
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8691
(* NAMES                                                                     *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8692
(* Copyright (c) 2004 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8693
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8694
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8695
signature Metis_Name =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8696
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8697
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8698
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8699
(* A type of names.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8700
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8701
43268
c0eaa8b9bff5 removed yet another hack in "make_metis" script -- respect opacity of "Metis_Name.name"
blanchet
parents: 42102
diff changeset
  8702
type name
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8703
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8704
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8705
(* A total ordering.                                                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8706
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8707
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8708
val compare : name * name -> order
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8709
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8710
val equal : name -> name -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8711
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8712
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8713
(* Fresh names.                                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8714
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8715
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8716
val newName : unit -> name
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8717
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8718
val newNames : int -> name list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8719
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  8720
val variantPrime : {avoid : name -> bool} -> name -> name
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  8721
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  8722
val variantNum : {avoid : name -> bool} -> name -> name
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8723
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8724
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8725
(* Parsing and pretty printing.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8726
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8727
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8728
val pp : name Metis_Print.pp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8729
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8730
val toString : name -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8731
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8732
val fromString : string -> name
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8733
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8734
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8735
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8736
(**** Original file: src/Name.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8737
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8738
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8739
(* NAMES                                                                     *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8740
(* Copyright (c) 2004 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8741
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8742
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8743
structure Metis_Name :> Metis_Name =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8744
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8745
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8746
open Metis_Useful;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8747
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8748
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8749
(* A type of names.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8750
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8751
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8752
type name = string;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8753
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8754
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8755
(* A total ordering.                                                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8756
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8757
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8758
val compare = String.compare;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8759
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8760
fun equal n1 n2 = n1 = n2;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8761
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8762
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8763
(* Fresh variables.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8764
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8765
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8766
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8767
  val prefix  = "_";
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8768
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8769
  fun numName i = mkPrefix prefix (Int.toString i);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8770
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8771
  fun newName () = numName (newInt ());
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8772
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  8773
  fun newNames n = List.map numName (newInts n);
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  8774
end;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  8775
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  8776
fun variantPrime {avoid} =
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  8777
    let
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  8778
      fun variant n = if avoid n then variant (n ^ "'") else n
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8779
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8780
      variant
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8781
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8782
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8783
local
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  8784
  fun isDigitOrPrime c = c = #"'" orelse Char.isDigit c;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  8785
in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  8786
  fun variantNum {avoid} n =
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  8787
      if not (avoid n) then n
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8788
      else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8789
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8790
          val n = stripSuffix isDigitOrPrime n
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8791
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8792
          fun variant i =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8793
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8794
                val n_i = n ^ Int.toString i
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8795
              in
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  8796
                if avoid n_i then variant (i + 1) else n_i
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8797
              end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8798
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8799
          variant 0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8800
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8801
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8802
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8803
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8804
(* Parsing and pretty printing.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8805
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8806
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8807
val pp = Metis_Print.ppString;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8808
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8809
fun toString s : string = s;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8810
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8811
fun fromString s : name = s;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8812
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8813
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8814
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8815
structure Metis_NameOrdered =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8816
struct type t = Metis_Name.name val compare = Metis_Name.compare end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8817
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8818
structure Metis_NameMap = Metis_KeyMap (Metis_NameOrdered);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8819
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8820
structure Metis_NameSet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8821
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8822
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8823
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8824
  structure S = Metis_ElementSet (Metis_NameMap);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8825
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8826
  open S;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8827
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8828
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8829
val pp =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8830
    Metis_Print.ppMap
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8831
      toList
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8832
      (Metis_Print.ppBracket "{" "}" (Metis_Print.ppOpList "," Metis_Name.pp));
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8833
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8834
end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8835
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8836
(**** Original file: src/NameArity.sig ****)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8837
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8838
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8839
(* NAME/ARITY PAIRS                                                          *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8840
(* Copyright (c) 2004 Joe Hurd, distributed under the BSD License            *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8841
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8842
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8843
signature Metis_NameArity =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8844
sig
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8845
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8846
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8847
(* A type of name/arity pairs.                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8848
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8849
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8850
type nameArity = Metis_Name.name * int
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8851
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8852
val name : nameArity -> Metis_Name.name
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8853
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8854
val arity : nameArity -> int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8855
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8856
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8857
(* Testing for different arities.                                            *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8858
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8859
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8860
val nary : int -> nameArity -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8861
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8862
val nullary : nameArity -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8863
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8864
val unary : nameArity -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8865
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8866
val binary : nameArity -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8867
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8868
val ternary : nameArity -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8869
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8870
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8871
(* A total ordering.                                                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8872
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8873
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8874
val compare : nameArity * nameArity -> order
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8875
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8876
val equal : nameArity -> nameArity -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8877
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8878
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8879
(* Parsing and pretty printing.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8880
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8881
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8882
val pp : nameArity Metis_Print.pp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8883
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8884
end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8885
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8886
(**** Original file: src/NameArity.sml ****)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8887
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8888
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8889
(* NAME/ARITY PAIRS                                                          *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8890
(* Copyright (c) 2004 Joe Hurd, distributed under the BSD License            *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8891
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8892
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8893
structure Metis_NameArity :> Metis_NameArity =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8894
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8895
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8896
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8897
(* A type of name/arity pairs.                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8898
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8899
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8900
type nameArity = Metis_Name.name * int;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8901
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8902
fun name ((n,_) : nameArity) = n;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8903
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8904
fun arity ((_,i) : nameArity) = i;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8905
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8906
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8907
(* Testing for different arities.                                            *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8908
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8909
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8910
fun nary i n_i = arity n_i = i;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8911
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8912
val nullary = nary 0
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8913
and unary = nary 1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8914
and binary = nary 2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8915
and ternary = nary 3;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8916
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8917
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8918
(* A total ordering.                                                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8919
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8920
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8921
fun compare ((n1,i1),(n2,i2)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8922
    case Metis_Name.compare (n1,n2) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8923
      LESS => LESS
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8924
    | EQUAL => Int.compare (i1,i2)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8925
    | GREATER => GREATER;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8926
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8927
fun equal (n1,i1) (n2,i2) = i1 = i2 andalso Metis_Name.equal n1 n2;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8928
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8929
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8930
(* Parsing and pretty printing.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8931
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8932
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8933
fun pp (n,i) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8934
    Metis_Print.inconsistentBlock 0
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8935
      [Metis_Name.pp n,
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8936
       Metis_Print.ppString "/",
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8937
       Metis_Print.ppInt i];
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8938
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8939
end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8940
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8941
structure Metis_NameArityOrdered =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8942
struct type t = Metis_NameArity.nameArity val compare = Metis_NameArity.compare end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8943
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8944
structure Metis_NameArityMap =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8945
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8946
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8947
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8948
  structure S = Metis_KeyMap (Metis_NameArityOrdered);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8949
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8950
  open S;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8951
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8952
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8953
fun compose m1 m2 =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8954
    let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8955
      fun pk ((_,a),n) = peek m2 (n,a)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8956
    in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8957
      mapPartial pk m1
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8958
    end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8959
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8960
end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8961
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8962
structure Metis_NameAritySet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8963
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8964
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8965
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8966
  structure S = Metis_ElementSet (Metis_NameArityMap);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8967
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8968
  open S;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8969
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8970
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8971
val allNullary = all Metis_NameArity.nullary;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8972
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8973
val pp =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8974
    Metis_Print.ppMap
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8975
      toList
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8976
      (Metis_Print.ppBracket "{" "}" (Metis_Print.ppOpList "," Metis_NameArity.pp));
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8977
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8978
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8979
end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8980
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8981
(**** Original file: src/Term.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8982
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8983
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8984
(* FIRST ORDER LOGIC TERMS                                                   *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8985
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8986
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8987
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8988
signature Metis_Term =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8989
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8990
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8991
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8992
(* A type of first order logic terms.                                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8993
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8994
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8995
type var = Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8996
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8997
type functionName = Metis_Name.name
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8998
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8999
type function = functionName * int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9000
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9001
type const = functionName
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9002
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9003
datatype term =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9004
    Var of var
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9005
  | Fn of functionName * term list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9006
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9007
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9008
(* Constructors and destructors.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9009
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9010
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9011
(* Variables *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9012
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9013
val destVar : term -> var
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9014
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9015
val isVar : term -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9016
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9017
val equalVar : var -> term -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9018
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9019
(* Functions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9020
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9021
val destFn : term -> functionName * term list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9022
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9023
val isFn : term -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9024
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9025
val fnName : term -> functionName
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9026
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9027
val fnArguments : term -> term list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9028
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9029
val fnArity : term -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9030
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9031
val fnFunction : term -> function
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9032
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9033
val functions : term -> Metis_NameAritySet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9034
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9035
val functionNames : term -> Metis_NameSet.set
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9036
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9037
(* Constants *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9038
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9039
val mkConst : const -> term
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9040
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9041
val destConst : term -> const
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9042
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9043
val isConst : term -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9044
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9045
(* Binary functions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9046
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9047
val mkBinop : functionName -> term * term -> term
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9048
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9049
val destBinop : functionName -> term -> term * term
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9050
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9051
val isBinop : functionName -> term -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9052
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9053
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9054
(* The size of a term in symbols.                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9055
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9056
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9057
val symbols : term -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9058
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9059
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9060
(* A total comparison function for terms.                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9061
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9062
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9063
val compare : term * term -> order
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9064
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9065
val equal : term -> term -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9066
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9067
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9068
(* Subterms.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9069
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9070
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9071
type path = int list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9072
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9073
val subterm : term -> path -> term
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9074
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9075
val subterms : term -> (path * term) list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9076
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9077
val replace : term -> path * term -> term
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9078
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9079
val find : (term -> bool) -> term -> path option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9080
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9081
val ppPath : path Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9082
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9083
val pathToString : path -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9084
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9085
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9086
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9087
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9088
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9089
val freeIn : var -> term -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9090
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9091
val freeVars : term -> Metis_NameSet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9092
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9093
val freeVarsList : term list -> Metis_NameSet.set
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9094
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9095
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9096
(* Fresh variables.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9097
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9098
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9099
val newVar : unit -> term
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9100
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9101
val newVars : int -> term list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9102
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9103
val variantPrime : Metis_NameSet.set -> var -> var
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9104
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9105
val variantNum : Metis_NameSet.set -> var -> var
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9106
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9107
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9108
(* Special support for terms with type annotations.                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9109
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9110
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9111
val hasTypeFunctionName : functionName
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9112
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9113
val hasTypeFunction : function
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9114
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9115
val isTypedVar : term -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9116
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9117
val typedSymbols : term -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9118
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9119
val nonVarTypedSubterms : term -> (path * term) list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9120
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9121
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9122
(* Special support for terms with an explicit function application operator. *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9123
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9124
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9125
val appName : Metis_Name.name
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9126
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9127
val mkApp : term * term -> term
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9128
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9129
val destApp : term -> term * term
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9130
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9131
val isApp : term -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9132
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9133
val listMkApp : term * term list -> term
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9134
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9135
val stripApp : term -> term * term list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9136
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9137
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9138
(* Parsing and pretty printing.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9139
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9140
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9141
(* Infix symbols *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9142
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9143
val infixes : Metis_Print.infixes Unsynchronized.ref
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9144
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9145
(* The negation symbol *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9146
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9147
val negation : string Unsynchronized.ref
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9148
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9149
(* Binder symbols *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9150
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9151
val binders : string list Unsynchronized.ref
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9152
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9153
(* Bracket symbols *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9154
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9155
val brackets : (string * string) list Unsynchronized.ref
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9156
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9157
(* Pretty printing *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9158
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9159
val pp : term Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9160
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9161
val toString : term -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9162
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9163
(* Parsing *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9164
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9165
val fromString : string -> term
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9166
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9167
val parse : term Metis_Parse.quotation -> term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9168
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9169
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9170
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9171
(**** Original file: src/Term.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9172
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9173
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9174
(* FIRST ORDER LOGIC TERMS                                                   *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9175
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9176
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9177
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9178
structure Metis_Term :> Metis_Term =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9179
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9180
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9181
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9182
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9183
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9184
(* A type of first order logic terms.                                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9185
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9186
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9187
type var = Metis_Name.name;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9188
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9189
type functionName = Metis_Name.name;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9190
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9191
type function = functionName * int;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9192
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9193
type const = functionName;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9194
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9195
datatype term =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9196
    Var of Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9197
  | Fn of Metis_Name.name * term list;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9198
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9199
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9200
(* Constructors and destructors.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9201
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9202
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9203
(* Variables *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9204
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9205
fun destVar (Var v) = v
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9206
  | destVar (Fn _) = raise Error "destVar";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9207
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9208
val isVar = can destVar;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9209
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9210
fun equalVar v (Var v') = Metis_Name.equal v v'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9211
  | equalVar _ _ = false;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9212
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9213
(* Functions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9214
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9215
fun destFn (Fn f) = f
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9216
  | destFn (Var _) = raise Error "destFn";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9217
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9218
val isFn = can destFn;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9219
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9220
fun fnName tm = fst (destFn tm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9221
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9222
fun fnArguments tm = snd (destFn tm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9223
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9224
fun fnArity tm = length (fnArguments tm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9225
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9226
fun fnFunction tm = (fnName tm, fnArity tm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9227
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9228
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9229
  fun func fs [] = fs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9230
    | func fs (Var _ :: tms) = func fs tms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9231
    | func fs (Fn (n,l) :: tms) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9232
      func (Metis_NameAritySet.add fs (n, length l)) (l @ tms);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9233
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9234
  fun functions tm = func Metis_NameAritySet.empty [tm];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9235
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9236
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9237
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9238
  fun func fs [] = fs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9239
    | func fs (Var _ :: tms) = func fs tms
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9240
    | func fs (Fn (n,l) :: tms) = func (Metis_NameSet.add fs n) (l @ tms);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9241
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9242
  fun functionNames tm = func Metis_NameSet.empty [tm];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9243
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9244
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9245
(* Constants *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9246
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9247
fun mkConst c = (Fn (c, []));
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9248
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9249
fun destConst (Fn (c, [])) = c
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9250
  | destConst _ = raise Error "destConst";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9251
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9252
val isConst = can destConst;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9253
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9254
(* Binary functions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9255
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9256
fun mkBinop f (a,b) = Fn (f,[a,b]);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9257
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9258
fun destBinop f (Fn (x,[a,b])) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9259
    if Metis_Name.equal x f then (a,b) else raise Error "Metis_Term.destBinop: wrong binop"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9260
  | destBinop _ _ = raise Error "Metis_Term.destBinop: not a binop";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9261
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9262
fun isBinop f = can (destBinop f);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9263
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9264
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9265
(* The size of a term in symbols.                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9266
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9267
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  9268
val VAR_SYMBOLS = 1;
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  9269
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  9270
val FN_SYMBOLS = 1;
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  9271
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9272
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9273
  fun sz n [] = n
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  9274
    | sz n (Var _ :: tms) = sz (n + VAR_SYMBOLS) tms
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  9275
    | sz n (Fn (func,args) :: tms) = sz (n + FN_SYMBOLS) (args @ tms);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9276
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9277
  fun symbols tm = sz 0 [tm];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9278
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9279
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9280
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9281
(* A total comparison function for terms.                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9282
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9283
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9284
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9285
  fun cmp [] [] = EQUAL
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9286
    | cmp (tm1 :: tms1) (tm2 :: tms2) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9287
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9288
        val tm1_tm2 = (tm1,tm2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9289
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9290
        if Metis_Portable.pointerEqual tm1_tm2 then cmp tms1 tms2
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9291
        else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9292
          case tm1_tm2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9293
            (Var v1, Var v2) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9294
            (case Metis_Name.compare (v1,v2) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9295
               LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9296
             | EQUAL => cmp tms1 tms2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9297
             | GREATER => GREATER)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9298
          | (Var _, Fn _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9299
          | (Fn _, Var _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9300
          | (Fn (f1,a1), Fn (f2,a2)) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9301
            (case Metis_Name.compare (f1,f2) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9302
               LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9303
             | EQUAL =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9304
               (case Int.compare (length a1, length a2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9305
                  LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9306
                | EQUAL => cmp (a1 @ tms1) (a2 @ tms2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9307
                | GREATER => GREATER)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9308
             | GREATER => GREATER)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9309
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9310
    | cmp _ _ = raise Bug "Metis_Term.compare";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9311
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9312
  fun compare (tm1,tm2) = cmp [tm1] [tm2];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9313
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9314
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9315
fun equal tm1 tm2 = compare (tm1,tm2) = EQUAL;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9316
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9317
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9318
(* Subterms.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9319
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9320
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9321
type path = int list;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9322
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9323
fun subterm tm [] = tm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9324
  | subterm (Var _) (_ :: _) = raise Error "Metis_Term.subterm: Var"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9325
  | subterm (Fn (_,tms)) (h :: t) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9326
    if h >= length tms then raise Error "Metis_Term.replace: Fn"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9327
    else subterm (List.nth (tms,h)) t;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9328
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9329
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9330
  fun subtms [] acc = acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9331
    | subtms ((path,tm) :: rest) acc =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9332
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9333
        fun f (n,arg) = (n :: path, arg)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9334
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  9335
        val acc = (List.rev path, tm) :: acc
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9336
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9337
        case tm of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9338
          Var _ => subtms rest acc
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9339
        | Fn (_,args) => subtms (List.map f (enumerate args) @ rest) acc
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9340
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9341
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9342
  fun subterms tm = subtms [([],tm)] [];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9343
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9344
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9345
fun replace tm ([],res) = if equal res tm then tm else res
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9346
  | replace tm (h :: t, res) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9347
    case tm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9348
      Var _ => raise Error "Metis_Term.replace: Var"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9349
    | Fn (func,tms) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9350
      if h >= length tms then raise Error "Metis_Term.replace: Fn"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9351
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9352
        let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9353
          val arg = List.nth (tms,h)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9354
          val arg' = replace arg (t,res)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9355
        in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9356
          if Metis_Portable.pointerEqual (arg',arg) then tm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9357
          else Fn (func, updateNth (h,arg') tms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9358
        end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9359
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9360
fun find pred =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9361
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9362
      fun search [] = NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9363
        | search ((path,tm) :: rest) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  9364
          if pred tm then SOME (List.rev path)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9365
          else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9366
            case tm of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9367
              Var _ => search rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9368
            | Fn (_,a) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9369
              let
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9370
                val subtms = List.map (fn (i,t) => (i :: path, t)) (enumerate a)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9371
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9372
                search (subtms @ rest)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9373
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9374
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9375
      fn tm => search [([],tm)]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9376
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9377
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9378
val ppPath = Metis_Print.ppList Metis_Print.ppInt;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9379
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9380
val pathToString = Metis_Print.toString ppPath;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9381
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9382
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9383
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9384
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9385
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9386
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9387
  fun free _ [] = false
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9388
    | free v (Var w :: tms) = Metis_Name.equal v w orelse free v tms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9389
    | free v (Fn (_,args) :: tms) = free v (args @ tms);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9390
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9391
  fun freeIn v tm = free v [tm];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9392
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9393
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9394
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9395
  fun free vs [] = vs
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9396
    | free vs (Var v :: tms) = free (Metis_NameSet.add vs v) tms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9397
    | free vs (Fn (_,args) :: tms) = free vs (args @ tms);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9398
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9399
  val freeVarsList = free Metis_NameSet.empty;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9400
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9401
  fun freeVars tm = freeVarsList [tm];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9402
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9403
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9404
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9405
(* Fresh variables.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9406
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9407
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9408
fun newVar () = Var (Metis_Name.newName ());
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9409
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9410
fun newVars n = List.map Var (Metis_Name.newNames n);
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9411
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9412
local
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9413
  fun avoid av n = Metis_NameSet.member n av;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9414
in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9415
  fun variantPrime av = Metis_Name.variantPrime {avoid = avoid av};
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9416
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9417
  fun variantNum av = Metis_Name.variantNum {avoid = avoid av};
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9418
end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9419
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9420
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9421
(* Special support for terms with type annotations.                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9422
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9423
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9424
val hasTypeFunctionName = Metis_Name.fromString ":";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9425
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9426
val hasTypeFunction = (hasTypeFunctionName,2);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9427
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9428
fun destFnHasType ((f,a) : functionName * term list) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9429
    if not (Metis_Name.equal f hasTypeFunctionName) then
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9430
      raise Error "Metis_Term.destFnHasType"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9431
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9432
      case a of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9433
        [tm,ty] => (tm,ty)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9434
      | _ => raise Error "Metis_Term.destFnHasType";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9435
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9436
val isFnHasType = can destFnHasType;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9437
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9438
fun isTypedVar tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9439
    case tm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9440
      Var _ => true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9441
    | Fn func =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9442
      case total destFnHasType func of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9443
        SOME (Var _, _) => true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9444
      | _ => false;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9445
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9446
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9447
  fun sz n [] = n
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9448
    | sz n (tm :: tms) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9449
      case tm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9450
        Var _ => sz (n + 1) tms
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9451
      | Fn func =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9452
        case total destFnHasType func of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9453
          SOME (tm,_) => sz n (tm :: tms)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9454
        | NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9455
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9456
            val (_,a) = func
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9457
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9458
            sz (n + 1) (a @ tms)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9459
          end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9460
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9461
  fun typedSymbols tm = sz 0 [tm];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9462
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9463
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9464
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9465
  fun subtms [] acc = acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9466
    | subtms ((path,tm) :: rest) acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9467
      case tm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9468
        Var _ => subtms rest acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9469
      | Fn func =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9470
        case total destFnHasType func of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9471
          SOME (t,_) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9472
          (case t of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9473
             Var _ => subtms rest acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9474
           | Fn _ =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9475
             let
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  9476
               val acc = (List.rev path, tm) :: acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9477
               val rest = (0 :: path, t) :: rest
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9478
             in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9479
               subtms rest acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9480
             end)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9481
        | NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9482
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9483
            fun f (n,arg) = (n :: path, arg)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9484
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9485
            val (_,args) = func
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9486
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  9487
            val acc = (List.rev path, tm) :: acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9488
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9489
            val rest = List.map f (enumerate args) @ rest
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9490
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9491
            subtms rest acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9492
          end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9493
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9494
  fun nonVarTypedSubterms tm = subtms [([],tm)] [];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9495
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9496
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9497
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9498
(* Special support for terms with an explicit function application operator. *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9499
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9500
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9501
val appName = Metis_Name.fromString ".";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9502
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9503
fun mkFnApp (fTm,aTm) = (appName, [fTm,aTm]);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9504
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9505
fun mkApp f_a = Fn (mkFnApp f_a);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9506
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9507
fun destFnApp ((f,a) : Metis_Name.name * term list) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9508
    if not (Metis_Name.equal f appName) then raise Error "Metis_Term.destFnApp"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9509
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9510
      case a of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9511
        [fTm,aTm] => (fTm,aTm)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9512
      | _ => raise Error "Metis_Term.destFnApp";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9513
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9514
val isFnApp = can destFnApp;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9515
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9516
fun destApp tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9517
    case tm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9518
      Var _ => raise Error "Metis_Term.destApp"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9519
    | Fn func => destFnApp func;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9520
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9521
val isApp = can destApp;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9522
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9523
fun listMkApp (f,l) = List.foldl mkApp f l;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9524
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9525
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9526
  fun strip tms tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9527
      case total destApp tm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9528
        SOME (f,a) => strip (a :: tms) f
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9529
      | NONE => (tm,tms);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9530
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9531
  fun stripApp tm = strip [] tm;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9532
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9533
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9534
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9535
(* Parsing and pretty printing.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9536
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9537
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9538
(* Operators parsed and printed infix *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9539
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9540
val infixes =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9541
    (Unsynchronized.ref o Metis_Print.Infixes)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9542
      [(* ML symbols *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9543
       {token = "/", precedence = 7, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9544
       {token = "div", precedence = 7, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9545
       {token = "mod", precedence = 7, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9546
       {token = "*", precedence = 7, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9547
       {token = "+", precedence = 6, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9548
       {token = "-", precedence = 6, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9549
       {token = "^", precedence = 6, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9550
       {token = "@", precedence = 5, assoc = Metis_Print.RightAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9551
       {token = "::", precedence = 5, assoc = Metis_Print.RightAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9552
       {token = "=", precedence = 4, assoc = Metis_Print.NonAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9553
       {token = "<>", precedence = 4, assoc = Metis_Print.NonAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9554
       {token = "<=", precedence = 4, assoc = Metis_Print.NonAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9555
       {token = "<", precedence = 4, assoc = Metis_Print.NonAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9556
       {token = ">=", precedence = 4, assoc = Metis_Print.NonAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9557
       {token = ">", precedence = 4, assoc = Metis_Print.NonAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9558
       {token = "o", precedence = 3, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9559
       {token = "->", precedence = 2, assoc = Metis_Print.RightAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9560
       {token = ":", precedence = 1, assoc = Metis_Print.NonAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9561
       {token = ",", precedence = 0, assoc = Metis_Print.RightAssoc},
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9562
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9563
       (* Logical connectives *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9564
       {token = "/\\", precedence = ~1, assoc = Metis_Print.RightAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9565
       {token = "\\/", precedence = ~2, assoc = Metis_Print.RightAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9566
       {token = "==>", precedence = ~3, assoc = Metis_Print.RightAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9567
       {token = "<=>", precedence = ~4, assoc = Metis_Print.RightAssoc},
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9568
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9569
       (* Other symbols *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9570
       {token = ".", precedence = 9, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9571
       {token = "**", precedence = 8, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9572
       {token = "++", precedence = 6, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9573
       {token = "--", precedence = 6, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9574
       {token = "==", precedence = 4, assoc = Metis_Print.NonAssoc}];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9575
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9576
(* The negation symbol *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9577
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9578
val negation : string Unsynchronized.ref = Unsynchronized.ref "~";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9579
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9580
(* Binder symbols *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9581
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9582
val binders : string list Unsynchronized.ref = Unsynchronized.ref ["\\","!","?","?!"];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9583
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9584
(* Bracket symbols *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9585
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9586
val brackets : (string * string) list Unsynchronized.ref = Unsynchronized.ref [("[","]"),("{","}")];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9587
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9588
(* Pretty printing *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9589
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9590
fun pp inputTerm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9591
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9592
      val quants = !binders
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9593
      and iOps = !infixes
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9594
      and neg = !negation
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9595
      and bracks = !brackets
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9596
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9597
      val bMap =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9598
          let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9599
            fun f (b1,b2) = (b1 ^ b2, b1, b2)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9600
          in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9601
            List.map f bracks
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9602
          end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9603
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9604
      val bTokens = op@ (unzip bracks)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9605
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9606
      val iTokens = Metis_Print.tokensInfixes iOps
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9607
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9608
      fun destI tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9609
          case tm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9610
            Fn (f,[a,b]) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9611
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9612
              val f = Metis_Name.toString f
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9613
            in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9614
              if Metis_StringSet.member f iTokens then SOME (f,a,b) else NONE
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9615
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9616
          | _ => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9617
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9618
      fun isI tm = Option.isSome (destI tm)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9619
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9620
      fun iToken (_,tok) =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9621
          Metis_Print.program
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9622
            [(if tok = "," then Metis_Print.skip else Metis_Print.ppString " "),
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9623
             Metis_Print.ppString tok,
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  9624
             Metis_Print.break];
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9625
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9626
      val iPrinter = Metis_Print.ppInfixes iOps destI iToken
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9627
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9628
      val specialTokens =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9629
          Metis_StringSet.addList iTokens (neg :: quants @ ["$","(",")"] @ bTokens)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9630
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9631
      fun vName bv s = Metis_StringSet.member s bv
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9632
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9633
      fun checkVarName bv n =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9634
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9635
            val s = Metis_Name.toString n
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9636
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9637
            if vName bv s then s else "$" ^ s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9638
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9639
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9640
      fun varName bv = Metis_Print.ppMap (checkVarName bv) Metis_Print.ppString
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9641
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9642
      fun checkFunctionName bv n =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9643
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9644
            val s = Metis_Name.toString n
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9645
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9646
            if Metis_StringSet.member s specialTokens orelse vName bv s then
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9647
              "(" ^ s ^ ")"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9648
            else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9649
              s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9650
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9651
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9652
      fun functionName bv = Metis_Print.ppMap (checkFunctionName bv) Metis_Print.ppString
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9653
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9654
      fun stripNeg tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9655
          case tm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9656
            Fn (f,[a]) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9657
            if Metis_Name.toString f <> neg then (0,tm)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9658
            else let val (n,tm) = stripNeg a in (n + 1, tm) end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9659
          | _ => (0,tm)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9660
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9661
      val destQuant =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9662
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9663
            fun dest q (Fn (q', [Var v, body])) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9664
                if Metis_Name.toString q' <> q then NONE
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9665
                else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9666
                  (case dest q body of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9667
                     NONE => SOME (q,v,[],body)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9668
                   | SOME (_,v',vs,body) => SOME (q, v, v' :: vs, body))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9669
              | dest _ _ = NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9670
          in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9671
            fn tm => Metis_Useful.first (fn q => dest q tm) quants
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9672
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9673
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9674
      fun isQuant tm = Option.isSome (destQuant tm)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9675
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9676
      fun destBrack (Fn (b,[tm])) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9677
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9678
            val s = Metis_Name.toString b
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9679
          in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9680
            case List.find (fn (n,_,_) => n = s) bMap of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9681
              NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9682
            | SOME (_,b1,b2) => SOME (b1,tm,b2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9683
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9684
        | destBrack _ = NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9685
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9686
      fun isBrack tm = Option.isSome (destBrack tm)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9687
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9688
      fun functionArgument bv tm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9689
          Metis_Print.sequence
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  9690
            Metis_Print.break
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9691
            (if isBrack tm then customBracket bv tm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9692
             else if isVar tm orelse isConst tm then basic bv tm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9693
             else bracket bv tm)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9694
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9695
      and basic bv (Var v) = varName bv v
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9696
        | basic bv (Fn (f,args)) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  9697
          Metis_Print.inconsistentBlock 2
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9698
            (functionName bv f :: List.map (functionArgument bv) args)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9699
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9700
      and customBracket bv tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9701
          case destBrack tm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9702
            SOME (b1,tm,b2) => Metis_Print.ppBracket b1 b2 (term bv) tm
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9703
          | NONE => basic bv tm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9704
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9705
      and innerQuant bv tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9706
          case destQuant tm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9707
            NONE => term bv tm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9708
          | SOME (q,v,vs,tm) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9709
            let
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9710
              val bv = Metis_StringSet.addList bv (List.map Metis_Name.toString (v :: vs))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9711
            in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9712
              Metis_Print.program
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9713
                [Metis_Print.ppString q,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9714
                 varName bv v,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9715
                 Metis_Print.program
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  9716
                   (List.map (Metis_Print.sequence Metis_Print.break o varName bv) vs),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9717
                 Metis_Print.ppString ".",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  9718
                 Metis_Print.break,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9719
                 innerQuant bv tm]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9720
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9721
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9722
      and quantifier bv tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9723
          if not (isQuant tm) then customBracket bv tm
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  9724
          else Metis_Print.inconsistentBlock 2 [innerQuant bv tm]
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9725
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9726
      and molecule bv (tm,r) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9727
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9728
            val (n,tm) = stripNeg tm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9729
          in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  9730
            Metis_Print.inconsistentBlock n
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9731
              [Metis_Print.duplicate n (Metis_Print.ppString neg),
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9732
               if isI tm orelse (r andalso isQuant tm) then bracket bv tm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9733
               else quantifier bv tm]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9734
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9735
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9736
      and term bv tm = iPrinter (molecule bv) (tm,false)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9737
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9738
      and bracket bv tm = Metis_Print.ppBracket "(" ")" (term bv) tm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9739
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9740
      term Metis_StringSet.empty
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9741
    end inputTerm;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9742
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9743
val toString = Metis_Print.toString pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9744
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9745
(* Parsing *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9746
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9747
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9748
  open Metis_Parse;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9749
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9750
  infixr 9 >>++
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9751
  infixr 8 ++
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9752
  infixr 7 >>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9753
  infixr 6 ||
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9754
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9755
  val isAlphaNum =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9756
      let
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9757
        val alphaNumChars = String.explode "_'"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9758
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9759
        fn c => mem c alphaNumChars orelse Char.isAlphaNum c
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9760
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9761
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9762
  local
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9763
    val alphaNumToken = atLeastOne (some isAlphaNum) >> String.implode;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9764
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9765
    val symbolToken =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9766
        let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9767
          fun isNeg c = str c = !negation
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9768
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9769
          val symbolChars = String.explode "<>=-*+/\\?@|!$%&#^:;~"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9770
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9771
          fun isSymbol c = mem c symbolChars
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9772
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9773
          fun isNonNegSymbol c = not (isNeg c) andalso isSymbol c
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9774
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9775
          some isNeg >> str ||
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9776
          (some isNonNegSymbol ++ many (some isSymbol)) >>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9777
          (String.implode o op::)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9778
        end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9779
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9780
    val punctToken =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9781
        let
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9782
          val punctChars = String.explode "()[]{}.,"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9783
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9784
          fun isPunct c = mem c punctChars
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9785
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9786
          some isPunct >> str
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9787
        end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9788
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9789
    val lexToken = alphaNumToken || symbolToken || punctToken;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9790
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9791
    val space = many (some Char.isSpace);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9792
  in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9793
    val lexer = (space ++ lexToken ++ space) >> (fn (_,(tok,_)) => tok);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9794
  end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9795
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9796
  fun termParser inputStream =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9797
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9798
        val quants = !binders
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9799
        and iOps = !infixes
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9800
        and neg = !negation
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9801
        and bracks = ("(",")") :: !brackets
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9802
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9803
        val bracks = List.map (fn (b1,b2) => (b1 ^ b2, b1, b2)) bracks
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9804
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9805
        val bTokens = List.map #2 bracks @ List.map #3 bracks
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9806
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9807
        fun possibleVarName "" = false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9808
          | possibleVarName s = isAlphaNum (String.sub (s,0))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9809
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9810
        fun vName bv s = Metis_StringSet.member s bv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9811
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9812
        val iTokens = Metis_Print.tokensInfixes iOps
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9813
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9814
        fun iMk (f,a,b) = Fn (Metis_Name.fromString f, [a,b])
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9815
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9816
        val iParser = parseInfixes iOps iMk any
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9817
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9818
        val specialTokens =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9819
            Metis_StringSet.addList iTokens (neg :: quants @ ["$"] @ bTokens)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9820
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9821
        fun varName bv =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9822
            some (vName bv) ||
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9823
            (some (Metis_Useful.equal "$") ++ some possibleVarName) >> snd
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9824
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9825
        fun fName bv s =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9826
            not (Metis_StringSet.member s specialTokens) andalso not (vName bv s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9827
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9828
        fun functionName bv =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9829
            some (fName bv) ||
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9830
            (some (Metis_Useful.equal "(") ++ any ++ some (Metis_Useful.equal ")")) >>
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9831
            (fn (_,(s,_)) => s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9832
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9833
        fun basic bv tokens =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9834
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9835
              val var = varName bv >> (Var o Metis_Name.fromString)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9836
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9837
              val const =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9838
                  functionName bv >> (fn f => Fn (Metis_Name.fromString f, []))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9839
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9840
              fun bracket (ab,a,b) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9841
                  (some (Metis_Useful.equal a) ++ term bv ++ some (Metis_Useful.equal b)) >>
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9842
                  (fn (_,(tm,_)) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9843
                      if ab = "()" then tm else Fn (Metis_Name.fromString ab, [tm]))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9844
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9845
              fun quantifier q =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9846
                  let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9847
                    fun bind (v,t) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9848
                        Fn (Metis_Name.fromString q, [Var (Metis_Name.fromString v), t])
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9849
                  in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9850
                    (some (Metis_Useful.equal q) ++
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9851
                     atLeastOne (some possibleVarName) ++
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9852
                     some (Metis_Useful.equal ".")) >>++
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9853
                    (fn (_,(vs,_)) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9854
                        term (Metis_StringSet.addList bv vs) >>
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9855
                        (fn body => List.foldr bind body vs))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9856
                  end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9857
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9858
              var ||
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9859
              const ||
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9860
              first (List.map bracket bracks) ||
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9861
              first (List.map quantifier quants)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9862
            end tokens
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9863
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9864
        and molecule bv tokens =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9865
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9866
              val negations = many (some (Metis_Useful.equal neg)) >> length
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9867
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9868
              val function =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9869
                  (functionName bv ++ many (basic bv)) >>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9870
                  (fn (f,args) => Fn (Metis_Name.fromString f, args)) ||
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9871
                  basic bv
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9872
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9873
              (negations ++ function) >>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9874
              (fn (n,tm) => funpow n (fn t => Fn (Metis_Name.fromString neg, [t])) tm)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9875
            end tokens
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9876
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9877
        and term bv tokens = iParser (molecule bv) tokens
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9878
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9879
        term Metis_StringSet.empty
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9880
      end inputStream;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9881
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9882
  fun fromString input =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9883
      let
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9884
        val chars = Metis_Stream.fromList (String.explode input)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9885
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9886
        val tokens = everything (lexer >> singleton) chars
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9887
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9888
        val terms = everything (termParser >> singleton) tokens
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9889
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9890
        case Metis_Stream.toList terms of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9891
          [tm] => tm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9892
        | _ => raise Error "Metis_Term.fromString"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9893
      end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9894
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9895
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9896
local
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9897
  val antiquotedTermToString =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9898
      Metis_Print.toString (Metis_Print.ppBracket "(" ")" pp);
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9899
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9900
  val parse = Metis_Parse.parseQuotation antiquotedTermToString fromString;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9901
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9902
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9903
end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9904
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9905
structure Metis_TermOrdered =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9906
struct type t = Metis_Term.term val compare = Metis_Term.compare end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9907
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9908
structure Metis_TermMap = Metis_KeyMap (Metis_TermOrdered);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9909
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9910
structure Metis_TermSet = Metis_ElementSet (Metis_TermMap);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9911
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9912
(**** Original file: src/Subst.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9913
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9914
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9915
(* FIRST ORDER LOGIC SUBSTITUTIONS                                           *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9916
(* Copyright (c) 2002 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9917
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9918
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9919
signature Metis_Subst =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9920
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9921
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9922
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9923
(* A type of first order logic substitutions.                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9924
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9925
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9926
type subst
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9927
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9928
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9929
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9930
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9931
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9932
val empty : subst
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9933
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9934
val null : subst -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9935
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9936
val size : subst -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9937
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9938
val peek : subst -> Metis_Term.var -> Metis_Term.term option
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9939
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9940
val insert : subst -> Metis_Term.var * Metis_Term.term -> subst
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9941
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9942
val singleton : Metis_Term.var * Metis_Term.term -> subst
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9943
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9944
val toList : subst -> (Metis_Term.var * Metis_Term.term) list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9945
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9946
val fromList : (Metis_Term.var * Metis_Term.term) list -> subst
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9947
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9948
val foldl : (Metis_Term.var * Metis_Term.term * 'a -> 'a) -> 'a -> subst -> 'a
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9949
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9950
val foldr : (Metis_Term.var * Metis_Term.term * 'a -> 'a) -> 'a -> subst -> 'a
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9951
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9952
val pp : subst Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9953
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9954
val toString : subst -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9955
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9956
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9957
(* Normalizing removes identity substitutions.                               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9958
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9959
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9960
val normalize : subst -> subst
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9961
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9962
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9963
(* Applying a substitution to a first order logic term.                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9964
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9965
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9966
val subst : subst -> Metis_Term.term -> Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9967
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9968
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9969
(* Restricting a substitution to a smaller set of variables.                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9970
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9971
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9972
val restrict : subst -> Metis_NameSet.set -> subst
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9973
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9974
val remove : subst -> Metis_NameSet.set -> subst
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9975
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9976
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9977
(* Composing two substitutions so that the following identity holds:         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9978
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9979
(* subst (compose sub1 sub2) tm = subst sub2 (subst sub1 tm)                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9980
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9981
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9982
val compose : subst -> subst -> subst
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9983
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9984
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9985
(* Creating the union of two compatible substitutions.                       *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9986
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9987
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9988
val union : subst -> subst -> subst  (* raises Error *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9989
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9990
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9991
(* Substitutions can be inverted iff they are renaming substitutions.        *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9992
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9993
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9994
val invert : subst -> subst  (* raises Error *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9995
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9996
val isRenaming : subst -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9997
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9998
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9999
(* Creating a substitution to freshen variables.                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10000
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10001
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10002
val freshVars : Metis_NameSet.set -> subst
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10003
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10004
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10005
(* Free variables.                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10006
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10007
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10008
val redexes : subst -> Metis_NameSet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10009
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10010
val residueFreeVars : subst -> Metis_NameSet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10011
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10012
val freeVars : subst -> Metis_NameSet.set
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10013
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10014
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10015
(* Functions.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10016
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10017
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10018
val functions : subst -> Metis_NameAritySet.set
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10019
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10020
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10021
(* Matching for first order logic terms.                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10022
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10023
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10024
val match : subst -> Metis_Term.term -> Metis_Term.term -> subst  (* raises Error *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10025
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10026
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10027
(* Unification for first order logic terms.                                  *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10028
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10029
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10030
val unify : subst -> Metis_Term.term -> Metis_Term.term -> subst  (* raises Error *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10031
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10032
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10033
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10034
(**** Original file: src/Subst.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10035
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10036
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10037
(* FIRST ORDER LOGIC SUBSTITUTIONS                                           *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10038
(* Copyright (c) 2002 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10039
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10040
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10041
structure Metis_Subst :> Metis_Subst =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10042
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10043
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10044
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10045
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10046
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10047
(* A type of first order logic substitutions.                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10048
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10049
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10050
datatype subst = Metis_Subst of Metis_Term.term Metis_NameMap.map;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10051
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10052
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10053
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10054
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10055
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10056
val empty = Metis_Subst (Metis_NameMap.new ());
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10057
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10058
fun null (Metis_Subst m) = Metis_NameMap.null m;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10059
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10060
fun size (Metis_Subst m) = Metis_NameMap.size m;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10061
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10062
fun peek (Metis_Subst m) v = Metis_NameMap.peek m v;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10063
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10064
fun insert (Metis_Subst m) v_tm = Metis_Subst (Metis_NameMap.insert m v_tm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10065
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10066
fun singleton v_tm = insert empty v_tm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10067
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10068
fun toList (Metis_Subst m) = Metis_NameMap.toList m;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10069
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10070
fun fromList l = Metis_Subst (Metis_NameMap.fromList l);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10071
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10072
fun foldl f b (Metis_Subst m) = Metis_NameMap.foldl f b m;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10073
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10074
fun foldr f b (Metis_Subst m) = Metis_NameMap.foldr f b m;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10075
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10076
fun pp sub =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10077
    Metis_Print.ppBracket "<[" "]>"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10078
      (Metis_Print.ppOpList "," (Metis_Print.ppOp2 " |->" Metis_Name.pp Metis_Term.pp))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10079
      (toList sub);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10080
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10081
val toString = Metis_Print.toString pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10082
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10083
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10084
(* Normalizing removes identity substitutions.                               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10085
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10086
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10087
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10088
  fun isNotId (v,tm) = not (Metis_Term.equalVar v tm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10089
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10090
  fun normalize (sub as Metis_Subst m) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10091
      let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10092
        val m' = Metis_NameMap.filter isNotId m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10093
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10094
        if Metis_NameMap.size m = Metis_NameMap.size m' then sub else Metis_Subst m'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10095
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10096
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10097
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10098
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10099
(* Applying a substitution to a first order logic term.                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10100
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10101
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10102
fun subst sub =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10103
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10104
      fun tmSub (tm as Metis_Term.Var v) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10105
          (case peek sub v of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10106
             SOME tm' => if Metis_Portable.pointerEqual (tm,tm') then tm else tm'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10107
           | NONE => tm)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10108
        | tmSub (tm as Metis_Term.Fn (f,args)) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10109
          let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10110
            val args' = Metis_Sharing.map tmSub args
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10111
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10112
            if Metis_Portable.pointerEqual (args,args') then tm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10113
            else Metis_Term.Fn (f,args')
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10114
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10115
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10116
      fn tm => if null sub then tm else tmSub tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10117
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10118
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10119
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10120
(* Restricting a substitution to a given set of variables.                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10121
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10122
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10123
fun restrict (sub as Metis_Subst m) varSet =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10124
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10125
      fun isRestrictedVar (v,_) = Metis_NameSet.member v varSet
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10126
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10127
      val m' = Metis_NameMap.filter isRestrictedVar m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10128
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10129
      if Metis_NameMap.size m = Metis_NameMap.size m' then sub else Metis_Subst m'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10130
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10131
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10132
fun remove (sub as Metis_Subst m) varSet =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10133
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10134
      fun isRestrictedVar (v,_) = not (Metis_NameSet.member v varSet)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10135
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10136
      val m' = Metis_NameMap.filter isRestrictedVar m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10137
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10138
      if Metis_NameMap.size m = Metis_NameMap.size m' then sub else Metis_Subst m'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10139
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10140
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10141
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10142
(* Composing two substitutions so that the following identity holds:         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10143
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10144
(* subst (compose sub1 sub2) tm = subst sub2 (subst sub1 tm)                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10145
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10146
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10147
fun compose (sub1 as Metis_Subst m1) sub2 =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10148
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10149
      fun f (v,tm,s) = insert s (v, subst sub2 tm)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10150
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10151
      if null sub2 then sub1 else Metis_NameMap.foldl f sub2 m1
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10152
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10153
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10154
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10155
(* Creating the union of two compatible substitutions.                       *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10156
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10157
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10158
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10159
  fun compatible ((_,tm1),(_,tm2)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10160
      if Metis_Term.equal tm1 tm2 then SOME tm1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10161
      else raise Error "Metis_Subst.union: incompatible";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10162
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10163
  fun union (s1 as Metis_Subst m1) (s2 as Metis_Subst m2) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10164
      if Metis_NameMap.null m1 then s2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10165
      else if Metis_NameMap.null m2 then s1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10166
      else Metis_Subst (Metis_NameMap.union compatible m1 m2);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10167
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10168
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10169
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10170
(* Substitutions can be inverted iff they are renaming substitutions.        *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10171
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10172
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10173
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10174
  fun inv (v, Metis_Term.Var w, s) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10175
      if Metis_NameMap.inDomain w s then raise Error "Metis_Subst.invert: non-injective"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10176
      else Metis_NameMap.insert s (w, Metis_Term.Var v)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10177
    | inv (_, Metis_Term.Fn _, _) = raise Error "Metis_Subst.invert: non-variable";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10178
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10179
  fun invert (Metis_Subst m) = Metis_Subst (Metis_NameMap.foldl inv (Metis_NameMap.new ()) m);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10180
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10181
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10182
val isRenaming = can invert;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10183
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10184
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10185
(* Creating a substitution to freshen variables.                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10186
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10187
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10188
val freshVars =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10189
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10190
      fun add (v,m) = insert m (v, Metis_Term.newVar ())
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10191
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10192
      Metis_NameSet.foldl add empty
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10193
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10194
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10195
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10196
(* Free variables.                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10197
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10198
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10199
val redexes =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10200
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10201
      fun add (v,_,s) = Metis_NameSet.add s v
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10202
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10203
      foldl add Metis_NameSet.empty
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10204
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10205
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10206
val residueFreeVars =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10207
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10208
      fun add (_,t,s) = Metis_NameSet.union s (Metis_Term.freeVars t)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10209
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10210
      foldl add Metis_NameSet.empty
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10211
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10212
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10213
val freeVars =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10214
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10215
      fun add (v,t,s) = Metis_NameSet.union (Metis_NameSet.add s v) (Metis_Term.freeVars t)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10216
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10217
      foldl add Metis_NameSet.empty
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10218
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10219
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10220
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10221
(* Functions.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10222
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10223
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10224
val functions =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10225
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10226
      fun add (_,t,s) = Metis_NameAritySet.union s (Metis_Term.functions t)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10227
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10228
      foldl add Metis_NameAritySet.empty
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10229
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10230
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10231
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10232
(* Matching for first order logic terms.                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10233
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10234
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10235
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10236
  fun matchList sub [] = sub
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10237
    | matchList sub ((Metis_Term.Var v, tm) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10238
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10239
        val sub =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10240
            case peek sub v of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10241
              NONE => insert sub (v,tm)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10242
            | SOME tm' =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10243
              if Metis_Term.equal tm tm' then sub
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10244
              else raise Error "Metis_Subst.match: incompatible matches"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10245
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10246
        matchList sub rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10247
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10248
    | matchList sub ((Metis_Term.Fn (f1,args1), Metis_Term.Fn (f2,args2)) :: rest) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10249
      if Metis_Name.equal f1 f2 andalso length args1 = length args2 then
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10250
        matchList sub (zip args1 args2 @ rest)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10251
      else raise Error "Metis_Subst.match: different structure"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10252
    | matchList _ _ = raise Error "Metis_Subst.match: functions can't match vars";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10253
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10254
  fun match sub tm1 tm2 = matchList sub [(tm1,tm2)];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10255
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10256
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10257
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10258
(* Unification for first order logic terms.                                  *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10259
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10260
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10261
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10262
  fun solve sub [] = sub
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10263
    | solve sub ((tm1_tm2 as (tm1,tm2)) :: rest) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10264
      if Metis_Portable.pointerEqual tm1_tm2 then solve sub rest
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10265
      else solve' sub (subst sub tm1) (subst sub tm2) rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10266
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10267
  and solve' sub (Metis_Term.Var v) tm rest =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10268
      if Metis_Term.equalVar v tm then solve sub rest
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10269
      else if Metis_Term.freeIn v tm then raise Error "Metis_Subst.unify: occurs check"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10270
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10271
        (case peek sub v of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10272
           NONE => solve (compose sub (singleton (v,tm))) rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10273
         | SOME tm' => solve' sub tm' tm rest)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10274
    | solve' sub tm1 (tm2 as Metis_Term.Var _) rest = solve' sub tm2 tm1 rest
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10275
    | solve' sub (Metis_Term.Fn (f1,args1)) (Metis_Term.Fn (f2,args2)) rest =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10276
      if Metis_Name.equal f1 f2 andalso length args1 = length args2 then
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10277
        solve sub (zip args1 args2 @ rest)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10278
      else
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10279
        raise Error "Metis_Subst.unify: different structure";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10280
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10281
  fun unify sub tm1 tm2 = solve sub [(tm1,tm2)];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10282
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10283
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10284
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10285
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10286
(**** Original file: src/Atom.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10287
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10288
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10289
(* FIRST ORDER LOGIC ATOMS                                                   *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10290
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10291
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10292
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10293
signature Metis_Atom =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10294
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10295
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10296
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10297
(* A type for storing first order logic atoms.                               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10298
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10299
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10300
type relationName = Metis_Name.name
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10301
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10302
type relation = relationName * int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10303
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10304
type atom = relationName * Metis_Term.term list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10305
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10306
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10307
(* Constructors and destructors.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10308
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10309
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10310
val name : atom -> relationName
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10311
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10312
val arguments : atom -> Metis_Term.term list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10313
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10314
val arity : atom -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10315
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10316
val relation : atom -> relation
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10317
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10318
val functions : atom -> Metis_NameAritySet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10319
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10320
val functionNames : atom -> Metis_NameSet.set
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10321
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10322
(* Binary relations *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10323
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10324
val mkBinop : relationName -> Metis_Term.term * Metis_Term.term -> atom
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10325
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10326
val destBinop : relationName -> atom -> Metis_Term.term * Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10327
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10328
val isBinop : relationName -> atom -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10329
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10330
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10331
(* The size of an atom in symbols.                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10332
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10333
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10334
val symbols : atom -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10335
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10336
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10337
(* A total comparison function for atoms.                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10338
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10339
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10340
val compare : atom * atom -> order
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10341
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10342
val equal : atom -> atom -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10343
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10344
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10345
(* Subterms.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10346
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10347
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10348
val subterm : atom -> Metis_Term.path -> Metis_Term.term
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10349
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10350
val subterms : atom -> (Metis_Term.path * Metis_Term.term) list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10351
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10352
val replace : atom -> Metis_Term.path * Metis_Term.term -> atom
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10353
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10354
val find : (Metis_Term.term -> bool) -> atom -> Metis_Term.path option
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10355
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10356
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10357
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10358
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10359
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10360
val freeIn : Metis_Term.var -> atom -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10361
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10362
val freeVars : atom -> Metis_NameSet.set
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10363
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10364
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10365
(* Substitutions.                                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10366
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10367
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10368
val subst : Metis_Subst.subst -> atom -> atom
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10369
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10370
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10371
(* Matching.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10372
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10373
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10374
val match : Metis_Subst.subst -> atom -> atom -> Metis_Subst.subst  (* raises Error *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10375
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10376
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10377
(* Unification.                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10378
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10379
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10380
val unify : Metis_Subst.subst -> atom -> atom -> Metis_Subst.subst  (* raises Error *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10381
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10382
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10383
(* The equality relation.                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10384
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10385
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10386
val eqRelationName : relationName
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10387
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10388
val eqRelation : relation
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10389
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10390
val mkEq : Metis_Term.term * Metis_Term.term -> atom
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10391
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10392
val destEq : atom -> Metis_Term.term * Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10393
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10394
val isEq : atom -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10395
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10396
val mkRefl : Metis_Term.term -> atom
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10397
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10398
val destRefl : atom -> Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10399
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10400
val isRefl : atom -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10401
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10402
val sym : atom -> atom  (* raises Error if given a refl *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10403
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10404
val lhs : atom -> Metis_Term.term
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10405
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10406
val rhs : atom -> Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10407
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10408
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10409
(* Special support for terms with type annotations.                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10410
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10411
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10412
val typedSymbols : atom -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10413
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10414
val nonVarTypedSubterms : atom -> (Metis_Term.path * Metis_Term.term) list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10415
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10416
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10417
(* Parsing and pretty printing.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10418
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10419
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10420
val pp : atom Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10421
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10422
val toString : atom -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10423
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10424
val fromString : string -> atom
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10425
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10426
val parse : Metis_Term.term Metis_Parse.quotation -> atom
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10427
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10428
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10429
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10430
(**** Original file: src/Atom.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10431
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10432
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10433
(* FIRST ORDER LOGIC ATOMS                                                   *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10434
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10435
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10436
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10437
structure Metis_Atom :> Metis_Atom =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10438
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10439
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10440
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10441
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10442
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10443
(* A type for storing first order logic atoms.                               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10444
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10445
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10446
type relationName = Metis_Name.name;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10447
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10448
type relation = relationName * int;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10449
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10450
type atom = relationName * Metis_Term.term list;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10451
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10452
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10453
(* Constructors and destructors.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10454
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10455
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10456
fun name ((rel,_) : atom) = rel;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10457
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10458
fun arguments ((_,args) : atom) = args;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10459
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10460
fun arity atm = length (arguments atm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10461
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10462
fun relation atm = (name atm, arity atm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10463
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10464
val functions =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10465
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10466
      fun f (tm,acc) = Metis_NameAritySet.union (Metis_Term.functions tm) acc
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10467
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10468
      fn atm => List.foldl f Metis_NameAritySet.empty (arguments atm)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10469
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10470
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10471
val functionNames =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10472
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10473
      fun f (tm,acc) = Metis_NameSet.union (Metis_Term.functionNames tm) acc
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10474
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10475
      fn atm => List.foldl f Metis_NameSet.empty (arguments atm)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10476
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10477
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10478
(* Binary relations *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10479
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10480
fun mkBinop p (a,b) : atom = (p,[a,b]);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10481
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10482
fun destBinop p (x,[a,b]) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10483
    if Metis_Name.equal x p then (a,b) else raise Error "Metis_Atom.destBinop: wrong binop"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10484
  | destBinop _ _ = raise Error "Metis_Atom.destBinop: not a binop";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10485
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10486
fun isBinop p = can (destBinop p);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10487
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10488
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10489
(* The size of an atom in symbols.                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10490
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10491
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10492
fun symbols atm =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10493
    List.foldl (fn (tm,z) => Metis_Term.symbols tm + z) 1 (arguments atm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10494
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10495
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10496
(* A total comparison function for atoms.                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10497
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10498
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10499
fun compare ((p1,tms1),(p2,tms2)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10500
    case Metis_Name.compare (p1,p2) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10501
      LESS => LESS
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10502
    | EQUAL => lexCompare Metis_Term.compare (tms1,tms2)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10503
    | GREATER => GREATER;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10504
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10505
fun equal atm1 atm2 = compare (atm1,atm2) = EQUAL;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10506
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10507
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10508
(* Subterms.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10509
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10510
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10511
fun subterm _ [] = raise Bug "Metis_Atom.subterm: empty path"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10512
  | subterm ((_,tms) : atom) (h :: t) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10513
    if h >= length tms then raise Error "Metis_Atom.subterm: bad path"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10514
    else Metis_Term.subterm (List.nth (tms,h)) t;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10515
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10516
fun subterms ((_,tms) : atom) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10517
    let
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 10518
      fun f ((n,tm),l) = List.map (fn (p,s) => (n :: p, s)) (Metis_Term.subterms tm) @ l
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10519
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10520
      List.foldl f [] (enumerate tms)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10521
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10522
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10523
fun replace _ ([],_) = raise Bug "Metis_Atom.replace: empty path"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10524
  | replace (atm as (rel,tms)) (h :: t, res) : atom =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10525
    if h >= length tms then raise Error "Metis_Atom.replace: bad path"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10526
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10527
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10528
        val tm = List.nth (tms,h)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10529
        val tm' = Metis_Term.replace tm (t,res)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10530
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10531
        if Metis_Portable.pointerEqual (tm,tm') then atm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10532
        else (rel, updateNth (h,tm') tms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10533
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10534
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10535
fun find pred =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10536
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10537
      fun f (i,tm) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10538
          case Metis_Term.find pred tm of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10539
            SOME path => SOME (i :: path)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10540
          | NONE => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10541
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10542
      fn (_,tms) : atom => first f (enumerate tms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10543
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10544
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10545
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10546
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10547
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10548
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10549
fun freeIn v atm = List.exists (Metis_Term.freeIn v) (arguments atm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10550
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10551
val freeVars =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10552
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10553
      fun f (tm,acc) = Metis_NameSet.union (Metis_Term.freeVars tm) acc
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10554
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10555
      fn atm => List.foldl f Metis_NameSet.empty (arguments atm)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10556
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10557
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10558
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10559
(* Substitutions.                                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10560
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10561
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10562
fun subst sub (atm as (p,tms)) : atom =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10563
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10564
      val tms' = Metis_Sharing.map (Metis_Subst.subst sub) tms
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10565
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10566
      if Metis_Portable.pointerEqual (tms',tms) then atm else (p,tms')
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10567
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10568
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10569
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10570
(* Matching.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10571
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10572
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10573
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10574
  fun matchArg ((tm1,tm2),sub) = Metis_Subst.match sub tm1 tm2;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10575
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10576
  fun match sub (p1,tms1) (p2,tms2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10577
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10578
        val _ = (Metis_Name.equal p1 p2 andalso length tms1 = length tms2) orelse
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10579
                raise Error "Metis_Atom.match"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10580
      in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10581
        List.foldl matchArg sub (zip tms1 tms2)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10582
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10583
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10584
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10585
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10586
(* Unification.                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10587
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10588
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10589
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10590
  fun unifyArg ((tm1,tm2),sub) = Metis_Subst.unify sub tm1 tm2;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10591
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10592
  fun unify sub (p1,tms1) (p2,tms2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10593
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10594
        val _ = (Metis_Name.equal p1 p2 andalso length tms1 = length tms2) orelse
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10595
                raise Error "Metis_Atom.unify"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10596
      in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10597
        List.foldl unifyArg sub (zip tms1 tms2)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10598
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10599
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10600
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10601
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10602
(* The equality relation.                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10603
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10604
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10605
val eqRelationName = Metis_Name.fromString "=";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10606
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10607
val eqRelationArity = 2;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10608
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10609
val eqRelation = (eqRelationName,eqRelationArity);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10610
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10611
val mkEq = mkBinop eqRelationName;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10612
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10613
fun destEq x = destBinop eqRelationName x;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10614
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10615
fun isEq x = isBinop eqRelationName x;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10616
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10617
fun mkRefl tm = mkEq (tm,tm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10618
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10619
fun destRefl atm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10620
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10621
      val (l,r) = destEq atm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10622
      val _ = Metis_Term.equal l r orelse raise Error "Metis_Atom.destRefl"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10623
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10624
      l
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10625
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10626
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10627
fun isRefl x = can destRefl x;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10628
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10629
fun sym atm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10630
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10631
      val (l,r) = destEq atm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10632
      val _ = not (Metis_Term.equal l r) orelse raise Error "Metis_Atom.sym: refl"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10633
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10634
      mkEq (r,l)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10635
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10636
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10637
fun lhs atm = fst (destEq atm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10638
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10639
fun rhs atm = snd (destEq atm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10640
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10641
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10642
(* Special support for terms with type annotations.                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10643
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10644
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10645
fun typedSymbols ((_,tms) : atom) =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10646
    List.foldl (fn (tm,z) => Metis_Term.typedSymbols tm + z) 1 tms;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10647
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10648
fun nonVarTypedSubterms (_,tms) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10649
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10650
      fun addArg ((n,arg),acc) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10651
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10652
            fun addTm ((path,tm),acc) = (n :: path, tm) :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10653
          in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10654
            List.foldl addTm acc (Metis_Term.nonVarTypedSubterms arg)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10655
          end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10656
    in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10657
      List.foldl addArg [] (enumerate tms)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10658
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10659
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10660
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10661
(* Parsing and pretty printing.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10662
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10663
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10664
val pp = Metis_Print.ppMap Metis_Term.Fn Metis_Term.pp;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10665
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10666
val toString = Metis_Print.toString pp;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10667
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10668
fun fromString s = Metis_Term.destFn (Metis_Term.fromString s);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10669
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10670
val parse = Metis_Parse.parseQuotation Metis_Term.toString fromString;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10671
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10672
end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10673
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10674
structure Metis_AtomOrdered =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10675
struct type t = Metis_Atom.atom val compare = Metis_Atom.compare end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10676
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10677
structure Metis_AtomMap = Metis_KeyMap (Metis_AtomOrdered);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10678
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10679
structure Metis_AtomSet = Metis_ElementSet (Metis_AtomMap);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10680
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10681
(**** Original file: src/Formula.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10682
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10683
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10684
(* FIRST ORDER LOGIC FORMULAS                                                *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10685
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10686
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10687
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10688
signature Metis_Formula =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10689
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10690
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10691
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10692
(* A type of first order logic formulas.                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10693
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10694
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10695
datatype formula =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10696
    True
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10697
  | False
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10698
  | Metis_Atom of Metis_Atom.atom
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10699
  | Not of formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10700
  | And of formula * formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10701
  | Or of formula * formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10702
  | Imp of formula * formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10703
  | Iff of formula * formula
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10704
  | Forall of Metis_Term.var * formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10705
  | Exists of Metis_Term.var * formula
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10706
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10707
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10708
(* Constructors and destructors.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10709
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10710
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10711
(* Booleans *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10712
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10713
val mkBoolean : bool -> formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10714
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10715
val destBoolean : formula -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10716
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10717
val isBoolean : formula -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10718
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10719
val isTrue : formula -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10720
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10721
val isFalse : formula -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10722
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10723
(* Functions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10724
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10725
val functions : formula -> Metis_NameAritySet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10726
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10727
val functionNames : formula -> Metis_NameSet.set
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10728
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10729
(* Relations *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10730
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10731
val relations : formula -> Metis_NameAritySet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10732
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10733
val relationNames : formula -> Metis_NameSet.set
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10734
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10735
(* Atoms *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10736
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10737
val destAtom : formula -> Metis_Atom.atom
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10738
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10739
val isAtom : formula -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10740
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10741
(* Negations *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10742
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10743
val destNeg : formula -> formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10744
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10745
val isNeg : formula -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10746
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10747
val stripNeg : formula -> int * formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10748
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10749
(* Conjunctions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10750
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10751
val listMkConj : formula list -> formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10752
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10753
val stripConj : formula -> formula list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10754
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10755
val flattenConj : formula -> formula list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10756
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10757
(* Disjunctions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10758
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10759
val listMkDisj : formula list -> formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10760
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10761
val stripDisj : formula -> formula list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10762
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10763
val flattenDisj : formula -> formula list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10764
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10765
(* Equivalences *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10766
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10767
val listMkEquiv : formula list -> formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10768
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10769
val stripEquiv : formula -> formula list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10770
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10771
val flattenEquiv : formula -> formula list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10772
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10773
(* Universal quantification *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10774
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10775
val destForall : formula -> Metis_Term.var * formula
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10776
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10777
val isForall : formula -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10778
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10779
val listMkForall : Metis_Term.var list * formula -> formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10780
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10781
val setMkForall : Metis_NameSet.set * formula -> formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10782
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10783
val stripForall : formula -> Metis_Term.var list * formula
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10784
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10785
(* Existential quantification *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10786
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10787
val destExists : formula -> Metis_Term.var * formula
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10788
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10789
val isExists : formula -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10790
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10791
val listMkExists : Metis_Term.var list * formula -> formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10792
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10793
val setMkExists : Metis_NameSet.set * formula -> formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10794
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10795
val stripExists : formula -> Metis_Term.var list * formula
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10796
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10797
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10798
(* The size of a formula in symbols.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10799
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10800
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10801
val symbols : formula -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10802
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10803
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10804
(* A total comparison function for formulas.                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10805
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10806
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10807
val compare : formula * formula -> order
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10808
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10809
val equal : formula -> formula -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10810
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10811
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10812
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10813
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10814
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10815
val freeIn : Metis_Term.var -> formula -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10816
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10817
val freeVars : formula -> Metis_NameSet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10818
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10819
val freeVarsList : formula list -> Metis_NameSet.set
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10820
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10821
val specialize : formula -> formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10822
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10823
val generalize : formula -> formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10824
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10825
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10826
(* Substitutions.                                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10827
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10828
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10829
val subst : Metis_Subst.subst -> formula -> formula
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10830
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10831
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10832
(* The equality relation.                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10833
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10834
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10835
val mkEq : Metis_Term.term * Metis_Term.term -> formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10836
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10837
val destEq : formula -> Metis_Term.term * Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10838
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10839
val isEq : formula -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10840
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10841
val mkNeq : Metis_Term.term * Metis_Term.term -> formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10842
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10843
val destNeq : formula -> Metis_Term.term * Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10844
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10845
val isNeq : formula -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10846
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10847
val mkRefl : Metis_Term.term -> formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10848
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10849
val destRefl : formula -> Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10850
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10851
val isRefl : formula -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10852
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10853
val sym : formula -> formula  (* raises Error if given a refl *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10854
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10855
val lhs : formula -> Metis_Term.term
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10856
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10857
val rhs : formula -> Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10858
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10859
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10860
(* Splitting goals.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10861
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10862
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10863
val splitGoal : formula -> formula list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10864
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10865
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10866
(* Parsing and pretty-printing.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10867
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10868
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10869
type quotation = formula Metis_Parse.quotation
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10870
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10871
val pp : formula Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10872
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10873
val toString : formula -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10874
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10875
val fromString : string -> formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10876
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10877
val parse : quotation -> formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10878
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10879
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10880
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10881
(**** Original file: src/Formula.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10882
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10883
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10884
(* FIRST ORDER LOGIC FORMULAS                                                *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10885
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10886
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10887
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10888
structure Metis_Formula :> Metis_Formula =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10889
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10890
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10891
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10892
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10893
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10894
(* A type of first order logic formulas.                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10895
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10896
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10897
datatype formula =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10898
    True
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10899
  | False
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10900
  | Metis_Atom of Metis_Atom.atom
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10901
  | Not of formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10902
  | And of formula * formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10903
  | Or of formula * formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10904
  | Imp of formula * formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10905
  | Iff of formula * formula
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10906
  | Forall of Metis_Term.var * formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10907
  | Exists of Metis_Term.var * formula;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10908
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10909
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10910
(* Constructors and destructors.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10911
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10912
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10913
(* Booleans *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10914
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10915
fun mkBoolean true = True
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10916
  | mkBoolean false = False;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10917
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10918
fun destBoolean True = true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10919
  | destBoolean False = false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10920
  | destBoolean _ = raise Error "destBoolean";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10921
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10922
val isBoolean = can destBoolean;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10923
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10924
fun isTrue fm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10925
    case fm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10926
      True => true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10927
    | _ => false;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10928
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10929
fun isFalse fm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10930
    case fm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10931
      False => true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10932
    | _ => false;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10933
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10934
(* Functions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10935
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10936
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10937
  fun funcs fs [] = fs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10938
    | funcs fs (True :: fms) = funcs fs fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10939
    | funcs fs (False :: fms) = funcs fs fms
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10940
    | funcs fs (Metis_Atom atm :: fms) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10941
      funcs (Metis_NameAritySet.union (Metis_Atom.functions atm) fs) fms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10942
    | funcs fs (Not p :: fms) = funcs fs (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10943
    | funcs fs (And (p,q) :: fms) = funcs fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10944
    | funcs fs (Or (p,q) :: fms) = funcs fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10945
    | funcs fs (Imp (p,q) :: fms) = funcs fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10946
    | funcs fs (Iff (p,q) :: fms) = funcs fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10947
    | funcs fs (Forall (_,p) :: fms) = funcs fs (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10948
    | funcs fs (Exists (_,p) :: fms) = funcs fs (p :: fms);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10949
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10950
  fun functions fm = funcs Metis_NameAritySet.empty [fm];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10951
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10952
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10953
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10954
  fun funcs fs [] = fs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10955
    | funcs fs (True :: fms) = funcs fs fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10956
    | funcs fs (False :: fms) = funcs fs fms
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10957
    | funcs fs (Metis_Atom atm :: fms) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10958
      funcs (Metis_NameSet.union (Metis_Atom.functionNames atm) fs) fms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10959
    | funcs fs (Not p :: fms) = funcs fs (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10960
    | funcs fs (And (p,q) :: fms) = funcs fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10961
    | funcs fs (Or (p,q) :: fms) = funcs fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10962
    | funcs fs (Imp (p,q) :: fms) = funcs fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10963
    | funcs fs (Iff (p,q) :: fms) = funcs fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10964
    | funcs fs (Forall (_,p) :: fms) = funcs fs (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10965
    | funcs fs (Exists (_,p) :: fms) = funcs fs (p :: fms);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10966
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10967
  fun functionNames fm = funcs Metis_NameSet.empty [fm];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10968
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10969
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10970
(* Relations *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10971
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10972
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10973
  fun rels fs [] = fs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10974
    | rels fs (True :: fms) = rels fs fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10975
    | rels fs (False :: fms) = rels fs fms
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10976
    | rels fs (Metis_Atom atm :: fms) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10977
      rels (Metis_NameAritySet.add fs (Metis_Atom.relation atm)) fms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10978
    | rels fs (Not p :: fms) = rels fs (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10979
    | rels fs (And (p,q) :: fms) = rels fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10980
    | rels fs (Or (p,q) :: fms) = rels fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10981
    | rels fs (Imp (p,q) :: fms) = rels fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10982
    | rels fs (Iff (p,q) :: fms) = rels fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10983
    | rels fs (Forall (_,p) :: fms) = rels fs (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10984
    | rels fs (Exists (_,p) :: fms) = rels fs (p :: fms);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10985
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10986
  fun relations fm = rels Metis_NameAritySet.empty [fm];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10987
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10988
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10989
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10990
  fun rels fs [] = fs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10991
    | rels fs (True :: fms) = rels fs fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10992
    | rels fs (False :: fms) = rels fs fms
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10993
    | rels fs (Metis_Atom atm :: fms) = rels (Metis_NameSet.add fs (Metis_Atom.name atm)) fms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10994
    | rels fs (Not p :: fms) = rels fs (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10995
    | rels fs (And (p,q) :: fms) = rels fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10996
    | rels fs (Or (p,q) :: fms) = rels fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10997
    | rels fs (Imp (p,q) :: fms) = rels fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10998
    | rels fs (Iff (p,q) :: fms) = rels fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10999
    | rels fs (Forall (_,p) :: fms) = rels fs (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11000
    | rels fs (Exists (_,p) :: fms) = rels fs (p :: fms);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11001
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11002
  fun relationNames fm = rels Metis_NameSet.empty [fm];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11003
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11004
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11005
(* Atoms *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11006
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11007
fun destAtom (Metis_Atom atm) = atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11008
  | destAtom _ = raise Error "Metis_Formula.destAtom";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11009
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11010
val isAtom = can destAtom;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11011
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11012
(* Negations *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11013
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11014
fun destNeg (Not p) = p
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11015
  | destNeg _ = raise Error "Metis_Formula.destNeg";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11016
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11017
val isNeg = can destNeg;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11018
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11019
val stripNeg =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11020
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11021
      fun strip n (Not fm) = strip (n + 1) fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11022
        | strip n fm = (n,fm)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11023
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11024
      strip 0
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11025
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11026
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11027
(* Conjunctions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11028
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11029
fun listMkConj fms =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 11030
    case List.rev fms of [] => True | fm :: fms => List.foldl And fm fms;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11031
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11032
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11033
  fun strip cs (And (p,q)) = strip (p :: cs) q
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 11034
    | strip cs fm = List.rev (fm :: cs);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11035
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11036
  fun stripConj True = []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11037
    | stripConj fm = strip [] fm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11038
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11039
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11040
val flattenConj =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11041
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11042
      fun flat acc [] = acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11043
        | flat acc (And (p,q) :: fms) = flat acc (q :: p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11044
        | flat acc (True :: fms) = flat acc fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11045
        | flat acc (fm :: fms) = flat (fm :: acc) fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11046
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11047
      fn fm => flat [] [fm]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11048
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11049
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11050
(* Disjunctions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11051
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11052
fun listMkDisj fms =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 11053
    case List.rev fms of [] => False | fm :: fms => List.foldl Or fm fms;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11054
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11055
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11056
  fun strip cs (Or (p,q)) = strip (p :: cs) q
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 11057
    | strip cs fm = List.rev (fm :: cs);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11058
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11059
  fun stripDisj False = []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11060
    | stripDisj fm = strip [] fm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11061
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11062
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11063
val flattenDisj =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11064
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11065
      fun flat acc [] = acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11066
        | flat acc (Or (p,q) :: fms) = flat acc (q :: p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11067
        | flat acc (False :: fms) = flat acc fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11068
        | flat acc (fm :: fms) = flat (fm :: acc) fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11069
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11070
      fn fm => flat [] [fm]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11071
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11072
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11073
(* Equivalences *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11074
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11075
fun listMkEquiv fms =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 11076
    case List.rev fms of [] => True | fm :: fms => List.foldl Iff fm fms;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11077
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11078
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11079
  fun strip cs (Iff (p,q)) = strip (p :: cs) q
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 11080
    | strip cs fm = List.rev (fm :: cs);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11081
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11082
  fun stripEquiv True = []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11083
    | stripEquiv fm = strip [] fm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11084
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11085
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11086
val flattenEquiv =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11087
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11088
      fun flat acc [] = acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11089
        | flat acc (Iff (p,q) :: fms) = flat acc (q :: p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11090
        | flat acc (True :: fms) = flat acc fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11091
        | flat acc (fm :: fms) = flat (fm :: acc) fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11092
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11093
      fn fm => flat [] [fm]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11094
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11095
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11096
(* Universal quantifiers *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11097
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11098
fun destForall (Forall v_f) = v_f
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11099
  | destForall _ = raise Error "destForall";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11100
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11101
val isForall = can destForall;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11102
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11103
fun listMkForall ([],body) = body
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11104
  | listMkForall (v :: vs, body) = Forall (v, listMkForall (vs,body));
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11105
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11106
fun setMkForall (vs,body) = Metis_NameSet.foldr Forall body vs;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11107
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11108
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11109
  fun strip vs (Forall (v,b)) = strip (v :: vs) b
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 11110
    | strip vs tm = (List.rev vs, tm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11111
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11112
  val stripForall = strip [];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11113
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11114
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11115
(* Existential quantifiers *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11116
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11117
fun destExists (Exists v_f) = v_f
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11118
  | destExists _ = raise Error "destExists";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11119
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11120
val isExists = can destExists;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11121
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11122
fun listMkExists ([],body) = body
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11123
  | listMkExists (v :: vs, body) = Exists (v, listMkExists (vs,body));
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11124
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11125
fun setMkExists (vs,body) = Metis_NameSet.foldr Exists body vs;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11126
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11127
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11128
  fun strip vs (Exists (v,b)) = strip (v :: vs) b
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 11129
    | strip vs tm = (List.rev vs, tm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11130
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11131
  val stripExists = strip [];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11132
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11133
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11134
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11135
(* The size of a formula in symbols.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11136
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11137
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11138
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11139
  fun sz n [] = n
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11140
    | sz n (True :: fms) = sz (n + 1) fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11141
    | sz n (False :: fms) = sz (n + 1) fms
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11142
    | sz n (Metis_Atom atm :: fms) = sz (n + Metis_Atom.symbols atm) fms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11143
    | sz n (Not p :: fms) = sz (n + 1) (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11144
    | sz n (And (p,q) :: fms) = sz (n + 1) (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11145
    | sz n (Or (p,q) :: fms) = sz (n + 1) (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11146
    | sz n (Imp (p,q) :: fms) = sz (n + 1) (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11147
    | sz n (Iff (p,q) :: fms) = sz (n + 1) (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11148
    | sz n (Forall (_,p) :: fms) = sz (n + 1) (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11149
    | sz n (Exists (_,p) :: fms) = sz (n + 1) (p :: fms);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11150
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11151
  fun symbols fm = sz 0 [fm];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11152
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11153
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11154
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11155
(* A total comparison function for formulas.                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11156
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11157
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11158
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11159
  fun cmp [] = EQUAL
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11160
    | cmp (f1_f2 :: fs) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11161
      if Metis_Portable.pointerEqual f1_f2 then cmp fs
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11162
      else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11163
        case f1_f2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11164
          (True,True) => cmp fs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11165
        | (True,_) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11166
        | (_,True) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11167
        | (False,False) => cmp fs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11168
        | (False,_) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11169
        | (_,False) => GREATER
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11170
        | (Metis_Atom atm1, Metis_Atom atm2) =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11171
          (case Metis_Atom.compare (atm1,atm2) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11172
             LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11173
           | EQUAL => cmp fs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11174
           | GREATER => GREATER)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11175
        | (Metis_Atom _, _) => LESS
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11176
        | (_, Metis_Atom _) => GREATER
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11177
        | (Not p1, Not p2) => cmp ((p1,p2) :: fs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11178
        | (Not _, _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11179
        | (_, Not _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11180
        | (And (p1,q1), And (p2,q2)) => cmp ((p1,p2) :: (q1,q2) :: fs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11181
        | (And _, _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11182
        | (_, And _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11183
        | (Or (p1,q1), Or (p2,q2)) => cmp ((p1,p2) :: (q1,q2) :: fs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11184
        | (Or _, _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11185
        | (_, Or _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11186
        | (Imp (p1,q1), Imp (p2,q2)) => cmp ((p1,p2) :: (q1,q2) :: fs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11187
        | (Imp _, _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11188
        | (_, Imp _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11189
        | (Iff (p1,q1), Iff (p2,q2)) => cmp ((p1,p2) :: (q1,q2) :: fs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11190
        | (Iff _, _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11191
        | (_, Iff _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11192
        | (Forall (v1,p1), Forall (v2,p2)) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11193
          (case Metis_Name.compare (v1,v2) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11194
             LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11195
           | EQUAL => cmp ((p1,p2) :: fs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11196
           | GREATER => GREATER)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11197
        | (Forall _, Exists _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11198
        | (Exists _, Forall _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11199
        | (Exists (v1,p1), Exists (v2,p2)) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11200
          (case Metis_Name.compare (v1,v2) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11201
             LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11202
           | EQUAL => cmp ((p1,p2) :: fs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11203
           | GREATER => GREATER);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11204
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11205
  fun compare fm1_fm2 = cmp [fm1_fm2];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11206
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11207
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11208
fun equal fm1 fm2 = compare (fm1,fm2) = EQUAL;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11209
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11210
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11211
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11212
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11213
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11214
fun freeIn v =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11215
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11216
      fun f [] = false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11217
        | f (True :: fms) = f fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11218
        | f (False :: fms) = f fms
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11219
        | f (Metis_Atom atm :: fms) = Metis_Atom.freeIn v atm orelse f fms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11220
        | f (Not p :: fms) = f (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11221
        | f (And (p,q) :: fms) = f (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11222
        | f (Or (p,q) :: fms) = f (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11223
        | f (Imp (p,q) :: fms) = f (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11224
        | f (Iff (p,q) :: fms) = f (p :: q :: fms)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11225
        | f (Forall (w,p) :: fms) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11226
          if Metis_Name.equal v w then f fms else f (p :: fms)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11227
        | f (Exists (w,p) :: fms) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11228
          if Metis_Name.equal v w then f fms else f (p :: fms)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11229
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11230
      fn fm => f [fm]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11231
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11232
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11233
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11234
  fun fv vs [] = vs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11235
    | fv vs ((_,True) :: fms) = fv vs fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11236
    | fv vs ((_,False) :: fms) = fv vs fms
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11237
    | fv vs ((bv, Metis_Atom atm) :: fms) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11238
      fv (Metis_NameSet.union vs (Metis_NameSet.difference (Metis_Atom.freeVars atm) bv)) fms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11239
    | fv vs ((bv, Not p) :: fms) = fv vs ((bv,p) :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11240
    | fv vs ((bv, And (p,q)) :: fms) = fv vs ((bv,p) :: (bv,q) :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11241
    | fv vs ((bv, Or (p,q)) :: fms) = fv vs ((bv,p) :: (bv,q) :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11242
    | fv vs ((bv, Imp (p,q)) :: fms) = fv vs ((bv,p) :: (bv,q) :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11243
    | fv vs ((bv, Iff (p,q)) :: fms) = fv vs ((bv,p) :: (bv,q) :: fms)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11244
    | fv vs ((bv, Forall (v,p)) :: fms) = fv vs ((Metis_NameSet.add bv v, p) :: fms)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11245
    | fv vs ((bv, Exists (v,p)) :: fms) = fv vs ((Metis_NameSet.add bv v, p) :: fms);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11246
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11247
  fun add (fm,vs) = fv vs [(Metis_NameSet.empty,fm)];
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11248
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11249
  fun freeVars fm = add (fm,Metis_NameSet.empty);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11250
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11251
  fun freeVarsList fms = List.foldl add Metis_NameSet.empty fms;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11252
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11253
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11254
fun specialize fm = snd (stripForall fm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11255
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11256
fun generalize fm = listMkForall (Metis_NameSet.toList (freeVars fm), fm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11257
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11258
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11259
(* Substitutions.                                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11260
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11261
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11262
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11263
  fun substCheck sub fm = if Metis_Subst.null sub then fm else substFm sub fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11264
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11265
  and substFm sub fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11266
      case fm of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11267
        True => fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11268
      | False => fm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11269
      | Metis_Atom (p,tms) =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11270
        let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11271
          val tms' = Metis_Sharing.map (Metis_Subst.subst sub) tms
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11272
        in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11273
          if Metis_Portable.pointerEqual (tms,tms') then fm else Metis_Atom (p,tms')
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11274
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11275
      | Not p =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11276
        let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11277
          val p' = substFm sub p
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11278
        in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11279
          if Metis_Portable.pointerEqual (p,p') then fm else Not p'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11280
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11281
      | And (p,q) => substConn sub fm And p q
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11282
      | Or (p,q) => substConn sub fm Or p q
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11283
      | Imp (p,q) => substConn sub fm Imp p q
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11284
      | Iff (p,q) => substConn sub fm Iff p q
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11285
      | Forall (v,p) => substQuant sub fm Forall v p
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11286
      | Exists (v,p) => substQuant sub fm Exists v p
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11287
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11288
  and substConn sub fm conn p q =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11289
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11290
        val p' = substFm sub p
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11291
        and q' = substFm sub q
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11292
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11293
        if Metis_Portable.pointerEqual (p,p') andalso
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11294
           Metis_Portable.pointerEqual (q,q')
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11295
        then fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11296
        else conn (p',q')
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11297
      end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11298
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11299
  and substQuant sub fm quant v p =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11300
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11301
        val v' =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11302
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11303
              fun f (w,s) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11304
                  if Metis_Name.equal w v then s
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11305
                  else
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11306
                    case Metis_Subst.peek sub w of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11307
                      NONE => Metis_NameSet.add s w
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11308
                    | SOME tm => Metis_NameSet.union s (Metis_Term.freeVars tm)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11309
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11310
              val vars = freeVars p
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11311
              val vars = Metis_NameSet.foldl f Metis_NameSet.empty vars
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11312
            in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11313
              Metis_Term.variantPrime vars v
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11314
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11315
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11316
        val sub =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11317
            if Metis_Name.equal v v' then Metis_Subst.remove sub (Metis_NameSet.singleton v)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11318
            else Metis_Subst.insert sub (v, Metis_Term.Var v')
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11319
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11320
        val p' = substCheck sub p
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11321
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11322
        if Metis_Name.equal v v' andalso Metis_Portable.pointerEqual (p,p') then fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11323
        else quant (v',p')
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11324
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11325
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11326
  val subst = substCheck;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11327
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11328
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11329
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11330
(* The equality relation.                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11331
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11332
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11333
fun mkEq a_b = Metis_Atom (Metis_Atom.mkEq a_b);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11334
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11335
fun destEq fm = Metis_Atom.destEq (destAtom fm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11336
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11337
val isEq = can destEq;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11338
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11339
fun mkNeq a_b = Not (mkEq a_b);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11340
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11341
fun destNeq (Not fm) = destEq fm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11342
  | destNeq _ = raise Error "Metis_Formula.destNeq";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11343
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11344
val isNeq = can destNeq;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11345
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11346
fun mkRefl tm = Metis_Atom (Metis_Atom.mkRefl tm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11347
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11348
fun destRefl fm = Metis_Atom.destRefl (destAtom fm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11349
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11350
val isRefl = can destRefl;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11351
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11352
fun sym fm = Metis_Atom (Metis_Atom.sym (destAtom fm));
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11353
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11354
fun lhs fm = fst (destEq fm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11355
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11356
fun rhs fm = snd (destEq fm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11357
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11358
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11359
(* Parsing and pretty-printing.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11360
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11361
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11362
type quotation = formula Metis_Parse.quotation;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11363
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11364
val truthName = Metis_Name.fromString "T"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11365
and falsityName = Metis_Name.fromString "F"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11366
and conjunctionName = Metis_Name.fromString "/\\"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11367
and disjunctionName = Metis_Name.fromString "\\/"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11368
and implicationName = Metis_Name.fromString "==>"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11369
and equivalenceName = Metis_Name.fromString "<=>"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11370
and universalName = Metis_Name.fromString "!"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11371
and existentialName = Metis_Name.fromString "?";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11372
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11373
local
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11374
  fun demote True = Metis_Term.Fn (truthName,[])
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11375
    | demote False = Metis_Term.Fn (falsityName,[])
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11376
    | demote (Metis_Atom (p,tms)) = Metis_Term.Fn (p,tms)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11377
    | demote (Not p) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11378
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11379
        val Unsynchronized.ref s = Metis_Term.negation
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11380
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11381
        Metis_Term.Fn (Metis_Name.fromString s, [demote p])
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11382
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11383
    | demote (And (p,q)) = Metis_Term.Fn (conjunctionName, [demote p, demote q])
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11384
    | demote (Or (p,q)) = Metis_Term.Fn (disjunctionName, [demote p, demote q])
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11385
    | demote (Imp (p,q)) = Metis_Term.Fn (implicationName, [demote p, demote q])
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11386
    | demote (Iff (p,q)) = Metis_Term.Fn (equivalenceName, [demote p, demote q])
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11387
    | demote (Forall (v,b)) = Metis_Term.Fn (universalName, [Metis_Term.Var v, demote b])
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11388
    | demote (Exists (v,b)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11389
      Metis_Term.Fn (existentialName, [Metis_Term.Var v, demote b]);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11390
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11391
  fun pp fm = Metis_Term.pp (demote fm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11392
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11393
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11394
val toString = Metis_Print.toString pp;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11395
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11396
local
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11397
  fun isQuant [Metis_Term.Var _, _] = true
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11398
    | isQuant _ = false;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11399
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11400
  fun promote (Metis_Term.Var v) = Metis_Atom (v,[])
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11401
    | promote (Metis_Term.Fn (f,tms)) =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 11402
      if Metis_Name.equal f truthName andalso List.null tms then
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11403
        True
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 11404
      else if Metis_Name.equal f falsityName andalso List.null tms then
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11405
        False
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11406
      else if Metis_Name.toString f = !Metis_Term.negation andalso length tms = 1 then
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11407
        Not (promote (hd tms))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11408
      else if Metis_Name.equal f conjunctionName andalso length tms = 2 then
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11409
        And (promote (hd tms), promote (List.nth (tms,1)))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11410
      else if Metis_Name.equal f disjunctionName andalso length tms = 2 then
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11411
        Or (promote (hd tms), promote (List.nth (tms,1)))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11412
      else if Metis_Name.equal f implicationName andalso length tms = 2 then
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11413
        Imp (promote (hd tms), promote (List.nth (tms,1)))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11414
      else if Metis_Name.equal f equivalenceName andalso length tms = 2 then
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11415
        Iff (promote (hd tms), promote (List.nth (tms,1)))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11416
      else if Metis_Name.equal f universalName andalso isQuant tms then
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11417
        Forall (Metis_Term.destVar (hd tms), promote (List.nth (tms,1)))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11418
      else if Metis_Name.equal f existentialName andalso isQuant tms then
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11419
        Exists (Metis_Term.destVar (hd tms), promote (List.nth (tms,1)))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11420
      else
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11421
        Metis_Atom (f,tms);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11422
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11423
  fun fromString s = promote (Metis_Term.fromString s);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11424
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11425
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11426
val parse = Metis_Parse.parseQuotation toString fromString;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11427
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11428
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11429
(* Splitting goals.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11430
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11431
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11432
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11433
  fun add_asms asms goal =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 11434
      if List.null asms then goal else Imp (listMkConj (List.rev asms), goal);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11435
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11436
  fun add_var_asms asms v goal = add_asms asms (Forall (v,goal));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11437
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11438
  fun split asms pol fm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11439
      case (pol,fm) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11440
        (* Positive splittables *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11441
        (true,True) => []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11442
      | (true, Not f) => split asms false f
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11443
      | (true, And (f1,f2)) => split asms true f1 @ split (f1 :: asms) true f2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11444
      | (true, Or (f1,f2)) => split (Not f1 :: asms) true f2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11445
      | (true, Imp (f1,f2)) => split (f1 :: asms) true f2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11446
      | (true, Iff (f1,f2)) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11447
        split (f1 :: asms) true f2 @ split (f2 :: asms) true f1
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 11448
      | (true, Forall (v,f)) => List.map (add_var_asms asms v) (split [] true f)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11449
        (* Negative splittables *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11450
      | (false,False) => []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11451
      | (false, Not f) => split asms true f
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11452
      | (false, And (f1,f2)) => split (f1 :: asms) false f2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11453
      | (false, Or (f1,f2)) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11454
        split asms false f1 @ split (Not f1 :: asms) false f2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11455
      | (false, Imp (f1,f2)) => split asms true f1 @ split (f1 :: asms) false f2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11456
      | (false, Iff (f1,f2)) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11457
        split (f1 :: asms) false f2 @ split (f2 :: asms) false f1
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 11458
      | (false, Exists (v,f)) => List.map (add_var_asms asms v) (split [] false f)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11459
        (* Unsplittables *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11460
      | _ => [add_asms asms (if pol then fm else Not fm)];
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11461
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11462
  fun splitGoal fm = split [] true fm;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11463
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11464
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11465
(*MetisTrace3
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11466
val splitGoal = fn fm =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11467
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11468
      val result = splitGoal fm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11469
      val () = Metis_Print.trace pp "Metis_Formula.splitGoal: fm" fm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11470
      val () = Metis_Print.trace (Metis_Print.ppList pp) "Metis_Formula.splitGoal: result" result
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11471
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11472
      result
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11473
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11474
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11475
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11476
end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11477
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11478
structure Metis_FormulaOrdered =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11479
struct type t = Metis_Formula.formula val compare = Metis_Formula.compare end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11480
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11481
structure Metis_FormulaMap = Metis_KeyMap (Metis_FormulaOrdered);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11482
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11483
structure Metis_FormulaSet = Metis_ElementSet (Metis_FormulaMap);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11484
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 11485
(**** Original file: src/Literal.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11486
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11487
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11488
(* FIRST ORDER LOGIC LITERALS                                                *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 11489
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11490
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11491
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11492
signature Metis_Literal =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11493
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11494
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11495
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11496
(* A type for storing first order logic literals.                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11497
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11498
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11499
type polarity = bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11500
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11501
type literal = polarity * Metis_Atom.atom
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11502
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11503
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11504
(* Constructors and destructors.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11505
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11506
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11507
val polarity : literal -> polarity
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11508
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11509
val atom : literal -> Metis_Atom.atom
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11510
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11511
val name : literal -> Metis_Atom.relationName
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11512
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11513
val arguments : literal -> Metis_Term.term list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11514
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11515
val arity : literal -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11516
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11517
val positive : literal -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11518
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11519
val negative : literal -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11520
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11521
val negate : literal -> literal
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11522
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11523
val relation : literal -> Metis_Atom.relation
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11524
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11525
val functions : literal -> Metis_NameAritySet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11526
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11527
val functionNames : literal -> Metis_NameSet.set
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11528
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11529
(* Binary relations *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11530
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11531
val mkBinop : Metis_Atom.relationName -> polarity * Metis_Term.term * Metis_Term.term -> literal
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11532
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11533
val destBinop : Metis_Atom.relationName -> literal -> polarity * Metis_Term.term * Metis_Term.term
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11534
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11535
val isBinop : Metis_Atom.relationName -> literal -> bool
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11536
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11537
(* Formulas *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11538
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11539
val toFormula : literal -> Metis_Formula.formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11540
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11541
val fromFormula : Metis_Formula.formula -> literal
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11542
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11543
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11544
(* The size of a literal in symbols.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11545
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11546
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11547
val symbols : literal -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11548
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11549
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11550
(* A total comparison function for literals.                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11551
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11552
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11553
val compare : literal * literal -> order  (* negative < positive *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11554
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11555
val equal : literal -> literal -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11556
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11557
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11558
(* Subterms.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11559
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11560
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11561
val subterm : literal -> Metis_Term.path -> Metis_Term.term
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11562
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11563
val subterms : literal -> (Metis_Term.path * Metis_Term.term) list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11564
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11565
val replace : literal -> Metis_Term.path * Metis_Term.term -> literal
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11566
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11567
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11568
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11569
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11570
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11571
val freeIn : Metis_Term.var -> literal -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11572
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11573
val freeVars : literal -> Metis_NameSet.set
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11574
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11575
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11576
(* Substitutions.                                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11577
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11578
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11579
val subst : Metis_Subst.subst -> literal -> literal
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11580
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11581
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11582
(* Matching.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11583
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11584
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11585
val match :  (* raises Error *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11586
    Metis_Subst.subst -> literal -> literal -> Metis_Subst.subst
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11587
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11588
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11589
(* Unification.                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11590
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11591
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11592
val unify :  (* raises Error *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11593
    Metis_Subst.subst -> literal -> literal -> Metis_Subst.subst
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11594
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11595
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11596
(* The equality relation.                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11597
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11598
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11599
val mkEq : Metis_Term.term * Metis_Term.term -> literal
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11600
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11601
val destEq : literal -> Metis_Term.term * Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11602
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11603
val isEq : literal -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11604
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11605
val mkNeq : Metis_Term.term * Metis_Term.term -> literal
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11606
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11607
val destNeq : literal -> Metis_Term.term * Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11608
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11609
val isNeq : literal -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11610
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11611
val mkRefl : Metis_Term.term -> literal
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11612
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11613
val destRefl : literal -> Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11614
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11615
val isRefl : literal -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11616
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11617
val mkIrrefl : Metis_Term.term -> literal
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11618
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11619
val destIrrefl : literal -> Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11620
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11621
val isIrrefl : literal -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11622
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11623
(* The following work with both equalities and disequalities *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11624
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11625
val sym : literal -> literal  (* raises Error if given a refl or irrefl *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11626
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11627
val lhs : literal -> Metis_Term.term
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11628
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11629
val rhs : literal -> Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11630
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11631
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11632
(* Special support for terms with type annotations.                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11633
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11634
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11635
val typedSymbols : literal -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11636
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11637
val nonVarTypedSubterms : literal -> (Metis_Term.path * Metis_Term.term) list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11638
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11639
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11640
(* Parsing and pretty-printing.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11641
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11642
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11643
val pp : literal Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11644
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11645
val toString : literal -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11646
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11647
val fromString : string -> literal
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11648
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11649
val parse : Metis_Term.term Metis_Parse.quotation -> literal
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11650
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11651
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11652
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 11653
(**** Original file: src/Literal.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11654
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11655
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11656
(* FIRST ORDER LOGIC LITERALS                                                *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 11657
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11658
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11659
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11660
structure Metis_Literal :> Metis_Literal =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11661
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11662
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11663
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11664
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11665
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11666
(* A type for storing first order logic literals.                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11667
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11668
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11669
type polarity = bool;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11670
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11671
type literal = polarity * Metis_Atom.atom;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11672
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11673
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11674
(* Constructors and destructors.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11675
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11676
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11677
fun polarity ((pol,_) : literal) = pol;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11678
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11679
fun atom ((_,atm) : literal) = atm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11680
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11681
fun name lit = Metis_Atom.name (atom lit);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11682
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11683
fun arguments lit = Metis_Atom.arguments (atom lit);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11684
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11685
fun arity lit = Metis_Atom.arity (atom lit);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11686
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11687
fun positive lit = polarity lit;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11688
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11689
fun negative lit = not (polarity lit);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11690
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11691
fun negate (pol,atm) : literal = (not pol, atm)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11692
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11693
fun relation lit = Metis_Atom.relation (atom lit);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11694
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11695
fun functions lit = Metis_Atom.functions (atom lit);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11696
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11697
fun functionNames lit = Metis_Atom.functionNames (atom lit);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11698
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11699
(* Binary relations *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11700
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11701
fun mkBinop rel (pol,a,b) : literal = (pol, Metis_Atom.mkBinop rel (a,b));
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11702
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11703
fun destBinop rel ((pol,atm) : literal) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11704
    case Metis_Atom.destBinop rel atm of (a,b) => (pol,a,b);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11705
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11706
fun isBinop rel = can (destBinop rel);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11707
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11708
(* Formulas *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11709
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11710
fun toFormula (true,atm) = Metis_Formula.Metis_Atom atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11711
  | toFormula (false,atm) = Metis_Formula.Not (Metis_Formula.Metis_Atom atm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11712
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11713
fun fromFormula (Metis_Formula.Metis_Atom atm) = (true,atm)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11714
  | fromFormula (Metis_Formula.Not (Metis_Formula.Metis_Atom atm)) = (false,atm)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11715
  | fromFormula _ = raise Error "Metis_Literal.fromFormula";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11716
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11717
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11718
(* The size of a literal in symbols.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11719
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11720
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11721
fun symbols ((_,atm) : literal) = Metis_Atom.symbols atm;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11722
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11723
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11724
(* A total comparison function for literals.                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11725
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11726
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11727
val compare = prodCompare boolCompare Metis_Atom.compare;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11728
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11729
fun equal (p1,atm1) (p2,atm2) = p1 = p2 andalso Metis_Atom.equal atm1 atm2;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11730
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11731
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11732
(* Subterms.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11733
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11734
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11735
fun subterm lit path = Metis_Atom.subterm (atom lit) path;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11736
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11737
fun subterms lit = Metis_Atom.subterms (atom lit);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11738
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11739
fun replace (lit as (pol,atm)) path_tm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11740
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11741
      val atm' = Metis_Atom.replace atm path_tm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11742
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11743
      if Metis_Portable.pointerEqual (atm,atm') then lit else (pol,atm')
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11744
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11745
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11746
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11747
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11748
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11749
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11750
fun freeIn v lit = Metis_Atom.freeIn v (atom lit);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11751
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11752
fun freeVars lit = Metis_Atom.freeVars (atom lit);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11753
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11754
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11755
(* Substitutions.                                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11756
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11757
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11758
fun subst sub (lit as (pol,atm)) : literal =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11759
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11760
      val atm' = Metis_Atom.subst sub atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11761
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11762
      if Metis_Portable.pointerEqual (atm',atm) then lit else (pol,atm')
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11763
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11764
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11765
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11766
(* Matching.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11767
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11768
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11769
fun match sub ((pol1,atm1) : literal) (pol2,atm2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11770
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11771
      val _ = pol1 = pol2 orelse raise Error "Metis_Literal.match"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11772
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11773
      Metis_Atom.match sub atm1 atm2
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11774
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11775
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11776
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11777
(* Unification.                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11778
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11779
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11780
fun unify sub ((pol1,atm1) : literal) (pol2,atm2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11781
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11782
      val _ = pol1 = pol2 orelse raise Error "Metis_Literal.unify"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11783
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11784
      Metis_Atom.unify sub atm1 atm2
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11785
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11786
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11787
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11788
(* The equality relation.                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11789
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11790
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11791
fun mkEq l_r : literal = (true, Metis_Atom.mkEq l_r);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11792
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11793
fun destEq ((true,atm) : literal) = Metis_Atom.destEq atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11794
  | destEq (false,_) = raise Error "Metis_Literal.destEq";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11795
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11796
val isEq = can destEq;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11797
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11798
fun mkNeq l_r : literal = (false, Metis_Atom.mkEq l_r);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11799
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11800
fun destNeq ((false,atm) : literal) = Metis_Atom.destEq atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11801
  | destNeq (true,_) = raise Error "Metis_Literal.destNeq";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11802
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11803
val isNeq = can destNeq;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11804
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11805
fun mkRefl tm = (true, Metis_Atom.mkRefl tm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11806
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11807
fun destRefl (true,atm) = Metis_Atom.destRefl atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11808
  | destRefl (false,_) = raise Error "Metis_Literal.destRefl";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11809
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11810
val isRefl = can destRefl;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11811
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11812
fun mkIrrefl tm = (false, Metis_Atom.mkRefl tm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11813
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11814
fun destIrrefl (true,_) = raise Error "Metis_Literal.destIrrefl"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11815
  | destIrrefl (false,atm) = Metis_Atom.destRefl atm;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11816
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11817
val isIrrefl = can destIrrefl;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11818
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11819
fun sym (pol,atm) : literal = (pol, Metis_Atom.sym atm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11820
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11821
fun lhs ((_,atm) : literal) = Metis_Atom.lhs atm;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11822
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11823
fun rhs ((_,atm) : literal) = Metis_Atom.rhs atm;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11824
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11825
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11826
(* Special support for terms with type annotations.                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11827
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11828
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11829
fun typedSymbols ((_,atm) : literal) = Metis_Atom.typedSymbols atm;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11830
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11831
fun nonVarTypedSubterms ((_,atm) : literal) = Metis_Atom.nonVarTypedSubterms atm;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11832
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11833
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11834
(* Parsing and pretty-printing.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11835
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11836
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11837
val pp = Metis_Print.ppMap toFormula Metis_Formula.pp;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11838
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11839
val toString = Metis_Print.toString pp;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11840
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11841
fun fromString s = fromFormula (Metis_Formula.fromString s);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11842
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11843
val parse = Metis_Parse.parseQuotation Metis_Term.toString fromString;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11844
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11845
end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11846
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11847
structure Metis_LiteralOrdered =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11848
struct type t = Metis_Literal.literal val compare = Metis_Literal.compare end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11849
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11850
structure Metis_LiteralMap = Metis_KeyMap (Metis_LiteralOrdered);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11851
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11852
structure Metis_LiteralSet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11853
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11854
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11855
  local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11856
    structure S = Metis_ElementSet (Metis_LiteralMap);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11857
  in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11858
    open S;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11859
  end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11860
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11861
  fun negateMember lit set = member (Metis_Literal.negate lit) set;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11862
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11863
  val negate =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11864
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11865
        fun f (lit,set) = add set (Metis_Literal.negate lit)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11866
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11867
        foldl f empty
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11868
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11869
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11870
  val relations =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11871
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11872
        fun f (lit,set) = Metis_NameAritySet.add set (Metis_Literal.relation lit)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11873
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11874
        foldl f Metis_NameAritySet.empty
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11875
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11876
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11877
  val functions =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11878
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11879
        fun f (lit,set) = Metis_NameAritySet.union set (Metis_Literal.functions lit)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11880
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11881
        foldl f Metis_NameAritySet.empty
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11882
      end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11883
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11884
  fun freeIn v = exists (Metis_Literal.freeIn v);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11885
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11886
  val freeVars =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11887
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11888
        fun f (lit,set) = Metis_NameSet.union set (Metis_Literal.freeVars lit)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11889
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11890
        foldl f Metis_NameSet.empty
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11891
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11892
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11893
  val freeVarsList =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11894
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11895
        fun f (lits,set) = Metis_NameSet.union set (freeVars lits)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11896
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11897
        List.foldl f Metis_NameSet.empty
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11898
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11899
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11900
  val symbols =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11901
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11902
        fun f (lit,z) = Metis_Literal.symbols lit + z
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11903
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11904
        foldl f 0
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11905
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11906
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11907
  val typedSymbols =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11908
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11909
        fun f (lit,z) = Metis_Literal.typedSymbols lit + z
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11910
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11911
        foldl f 0
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11912
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11913
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11914
  fun subst sub lits =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11915
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11916
        fun substLit (lit,(eq,lits')) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11917
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11918
              val lit' = Metis_Literal.subst sub lit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11919
              val eq = eq andalso Metis_Portable.pointerEqual (lit,lit')
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11920
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11921
              (eq, add lits' lit')
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11922
            end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11923
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11924
        val (eq,lits') = foldl substLit (true,empty) lits
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11925
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11926
        if eq then lits else lits'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11927
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11928
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11929
  fun conjoin set =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11930
      Metis_Formula.listMkConj (List.map Metis_Literal.toFormula (toList set));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11931
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11932
  fun disjoin set =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11933
      Metis_Formula.listMkDisj (List.map Metis_Literal.toFormula (toList set));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11934
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11935
  val pp =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11936
      Metis_Print.ppMap
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11937
        toList
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11938
        (Metis_Print.ppBracket "{" "}" (Metis_Print.ppOpList "," Metis_Literal.pp));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11939
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11940
end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11941
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11942
structure Metis_LiteralSetOrdered =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11943
struct type t = Metis_LiteralSet.set val compare = Metis_LiteralSet.compare end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11944
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11945
structure Metis_LiteralSetMap = Metis_KeyMap (Metis_LiteralSetOrdered);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11946
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11947
structure Metis_LiteralSetSet = Metis_ElementSet (Metis_LiteralSetMap);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11948
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 11949
(**** Original file: src/Thm.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11950
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11951
(* ========================================================================= *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11952
(* A LOGICAL KERNEL FOR FIRST ORDER CLAUSAL THEOREMS                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11953
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11954
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11955
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11956
signature Metis_Thm =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11957
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11958
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11959
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11960
(* An abstract type of first order logic theorems.                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11961
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11962
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11963
type thm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11964
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11965
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11966
(* Theorem destructors.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11967
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11968
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11969
type clause = Metis_LiteralSet.set
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11970
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11971
datatype inferenceType =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11972
    Axiom
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11973
  | Assume
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11974
  | Metis_Subst
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11975
  | Factor
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11976
  | Resolve
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11977
  | Refl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11978
  | Equality
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11979
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11980
type inference = inferenceType * thm list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11981
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11982
val clause : thm -> clause
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11983
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11984
val inference : thm -> inference
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11985
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11986
(* Tautologies *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11987
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11988
val isTautology : thm -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11989
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11990
(* Contradictions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11991
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11992
val isContradiction : thm -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11993
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11994
(* Unit theorems *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11995
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11996
val destUnit : thm -> Metis_Literal.literal
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11997
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11998
val isUnit : thm -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11999
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12000
(* Unit equality theorems *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12001
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12002
val destUnitEq : thm -> Metis_Term.term * Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12003
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12004
val isUnitEq : thm -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12005
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12006
(* Literals *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12007
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12008
val member : Metis_Literal.literal -> thm -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12009
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12010
val negateMember : Metis_Literal.literal -> thm -> bool
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12011
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12012
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12013
(* A total order.                                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12014
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12015
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12016
val compare : thm * thm -> order
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12017
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12018
val equal : thm -> thm -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12019
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12020
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12021
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12022
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12023
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12024
val freeIn : Metis_Term.var -> thm -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12025
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12026
val freeVars : thm -> Metis_NameSet.set
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12027
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12028
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12029
(* Pretty-printing.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12030
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12031
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12032
val ppInferenceType : inferenceType Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12033
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12034
val inferenceTypeToString : inferenceType -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12035
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12036
val pp : thm Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12037
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12038
val toString : thm -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12039
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12040
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12041
(* Primitive rules of inference.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12042
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12043
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12044
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12045
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12046
(* ----- axiom C                                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12047
(*   C                                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12048
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12049
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12050
val axiom : clause -> thm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12051
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12052
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12053
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12054
(* ----------- assume L                                                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12055
(*   L \/ ~L                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12056
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12057
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12058
val assume : Metis_Literal.literal -> thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12059
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12060
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12061
(*    C                                                                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12062
(* -------- subst s                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12063
(*   C[s]                                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12064
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12065
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12066
val subst : Metis_Subst.subst -> thm -> thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12067
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12068
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12069
(*   L \/ C    ~L \/ D                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12070
(* --------------------- resolve L                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12071
(*        C \/ D                                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12072
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12073
(* The literal L must occur in the first theorem, and the literal ~L must    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12074
(* occur in the second theorem.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12075
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12076
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12077
val resolve : Metis_Literal.literal -> thm -> thm -> thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12078
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12079
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12080
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12081
(* --------- refl t                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12082
(*   t = t                                                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12083
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12084
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12085
val refl : Metis_Term.term -> thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12086
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12087
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12088
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12089
(* ------------------------ equality L p t                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12090
(*   ~(s = t) \/ ~L \/ L'                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12091
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12092
(* where s is the subterm of L at path p, and L' is L with the subterm at    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12093
(* path p being replaced by t.                                               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12094
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12095
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12096
val equality : Metis_Literal.literal -> Metis_Term.path -> Metis_Term.term -> thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12097
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12098
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12099
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12100
(**** Original file: src/Thm.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12101
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12102
(* ========================================================================= *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12103
(* A LOGICAL KERNEL FOR FIRST ORDER CLAUSAL THEOREMS                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12104
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12105
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12106
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12107
structure Metis_Thm :> Metis_Thm =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12108
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12109
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12110
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12111
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12112
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12113
(* An abstract type of first order logic theorems.                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12114
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12115
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12116
type clause = Metis_LiteralSet.set;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12117
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12118
datatype inferenceType =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12119
    Axiom
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12120
  | Assume
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12121
  | Metis_Subst
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12122
  | Factor
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12123
  | Resolve
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12124
  | Refl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12125
  | Equality;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12126
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12127
datatype thm = Metis_Thm of clause * (inferenceType * thm list);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12128
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12129
type inference = inferenceType * thm list;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12130
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12131
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12132
(* Theorem destructors.                                                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12133
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12134
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12135
fun clause (Metis_Thm (cl,_)) = cl;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12136
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12137
fun inference (Metis_Thm (_,inf)) = inf;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12138
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12139
(* Tautologies *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12140
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12141
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12142
  fun chk (_,NONE) = NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12143
    | chk ((pol,atm), SOME set) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12144
      if (pol andalso Metis_Atom.isRefl atm) orelse Metis_AtomSet.member atm set then NONE
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12145
      else SOME (Metis_AtomSet.add set atm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12146
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12147
  fun isTautology th =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12148
      case Metis_LiteralSet.foldl chk (SOME Metis_AtomSet.empty) (clause th) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12149
        SOME _ => false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12150
      | NONE => true;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12151
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12152
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12153
(* Contradictions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12154
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12155
fun isContradiction th = Metis_LiteralSet.null (clause th);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12156
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12157
(* Unit theorems *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12158
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12159
fun destUnit (Metis_Thm (cl,_)) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12160
    if Metis_LiteralSet.size cl = 1 then Metis_LiteralSet.pick cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12161
    else raise Error "Metis_Thm.destUnit";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12162
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12163
val isUnit = can destUnit;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12164
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12165
(* Unit equality theorems *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12166
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12167
fun destUnitEq th = Metis_Literal.destEq (destUnit th);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12168
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12169
val isUnitEq = can destUnitEq;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12170
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12171
(* Literals *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12172
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12173
fun member lit (Metis_Thm (cl,_)) = Metis_LiteralSet.member lit cl;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12174
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12175
fun negateMember lit (Metis_Thm (cl,_)) = Metis_LiteralSet.negateMember lit cl;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12176
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12177
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12178
(* A total order.                                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12179
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12180
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12181
fun compare (th1,th2) = Metis_LiteralSet.compare (clause th1, clause th2);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12182
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12183
fun equal th1 th2 = Metis_LiteralSet.equal (clause th1) (clause th2);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12184
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12185
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12186
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12187
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12188
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12189
fun freeIn v (Metis_Thm (cl,_)) = Metis_LiteralSet.freeIn v cl;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12190
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12191
fun freeVars (Metis_Thm (cl,_)) = Metis_LiteralSet.freeVars cl;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12192
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12193
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12194
(* Pretty-printing.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12195
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12196
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12197
fun inferenceTypeToString Axiom = "Axiom"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12198
  | inferenceTypeToString Assume = "Assume"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12199
  | inferenceTypeToString Metis_Subst = "Metis_Subst"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12200
  | inferenceTypeToString Factor = "Factor"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12201
  | inferenceTypeToString Resolve = "Resolve"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12202
  | inferenceTypeToString Refl = "Refl"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12203
  | inferenceTypeToString Equality = "Equality";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12204
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12205
fun ppInferenceType inf =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12206
    Metis_Print.ppString (inferenceTypeToString inf);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12207
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12208
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12209
  fun toFormula th =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12210
      Metis_Formula.listMkDisj
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 12211
        (List.map Metis_Literal.toFormula (Metis_LiteralSet.toList (clause th)));
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12212
in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12213
  fun pp th =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12214
      Metis_Print.inconsistentBlock 3
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12215
        [Metis_Print.ppString "|- ",
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12216
         Metis_Formula.pp (toFormula th)];
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12217
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12218
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12219
val toString = Metis_Print.toString pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12220
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12221
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12222
(* Primitive rules of inference.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12223
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12224
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12225
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12226
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12227
(* ----- axiom C                                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12228
(*   C                                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12229
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12230
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12231
fun axiom cl = Metis_Thm (cl,(Axiom,[]));
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12232
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12233
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12234
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12235
(* ----------- assume L                                                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12236
(*   L \/ ~L                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12237
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12238
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12239
fun assume lit =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12240
    Metis_Thm (Metis_LiteralSet.fromList [lit, Metis_Literal.negate lit], (Assume,[]));
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12241
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12242
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12243
(*    C                                                                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12244
(* -------- subst s                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12245
(*   C[s]                                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12246
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12247
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12248
fun subst sub (th as Metis_Thm (cl,inf)) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12249
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12250
      val cl' = Metis_LiteralSet.subst sub cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12251
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12252
      if Metis_Portable.pointerEqual (cl,cl') then th
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12253
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12254
        case inf of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12255
          (Metis_Subst,_) => Metis_Thm (cl',inf)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12256
        | _ => Metis_Thm (cl',(Metis_Subst,[th]))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12257
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12258
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12259
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12260
(*   L \/ C    ~L \/ D                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12261
(* --------------------- resolve L                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12262
(*        C \/ D                                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12263
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12264
(* The literal L must occur in the first theorem, and the literal ~L must    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12265
(* occur in the second theorem.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12266
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12267
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12268
fun resolve lit (th1 as Metis_Thm (cl1,_)) (th2 as Metis_Thm (cl2,_)) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12269
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12270
      val cl1' = Metis_LiteralSet.delete cl1 lit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12271
      and cl2' = Metis_LiteralSet.delete cl2 (Metis_Literal.negate lit)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12272
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12273
      Metis_Thm (Metis_LiteralSet.union cl1' cl2', (Resolve,[th1,th2]))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12274
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12275
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12276
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12277
val resolve = fn lit => fn pos => fn neg =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12278
    resolve lit pos neg
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12279
    handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12280
      raise Error ("Metis_Thm.resolve:\nlit = " ^ Metis_Literal.toString lit ^
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12281
                   "\npos = " ^ toString pos ^
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12282
                   "\nneg = " ^ toString neg ^ "\n" ^ err);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12283
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12284
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12285
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12286
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12287
(* --------- refl t                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12288
(*   t = t                                                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12289
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12290
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12291
fun refl tm = Metis_Thm (Metis_LiteralSet.singleton (true, Metis_Atom.mkRefl tm), (Refl,[]));
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12292
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12293
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12294
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12295
(* ------------------------ equality L p t                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12296
(*   ~(s = t) \/ ~L \/ L'                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12297
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12298
(* where s is the subterm of L at path p, and L' is L with the subterm at    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12299
(* path p being replaced by t.                                               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12300
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12301
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12302
fun equality lit path t =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12303
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12304
      val s = Metis_Literal.subterm lit path
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12305
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12306
      val lit' = Metis_Literal.replace lit (path,t)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12307
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12308
      val eqLit = Metis_Literal.mkNeq (s,t)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12309
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12310
      val cl = Metis_LiteralSet.fromList [eqLit, Metis_Literal.negate lit, lit']
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12311
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12312
      Metis_Thm (cl,(Equality,[]))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12313
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12314
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12315
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12316
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12317
(**** Original file: src/Proof.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12318
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12319
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12320
(* PROOFS IN FIRST ORDER LOGIC                                               *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12321
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12322
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12323
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12324
signature Metis_Proof =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12325
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12326
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12327
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12328
(* A type of first order logic proofs.                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12329
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12330
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12331
datatype inference =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12332
    Axiom of Metis_LiteralSet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12333
  | Assume of Metis_Atom.atom
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12334
  | Metis_Subst of Metis_Subst.subst * Metis_Thm.thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12335
  | Resolve of Metis_Atom.atom * Metis_Thm.thm * Metis_Thm.thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12336
  | Refl of Metis_Term.term
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12337
  | Equality of Metis_Literal.literal * Metis_Term.path * Metis_Term.term
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12338
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12339
type proof = (Metis_Thm.thm * inference) list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12340
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12341
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12342
(* Reconstructing single inferences.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12343
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12344
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12345
val inferenceType : inference -> Metis_Thm.inferenceType
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12346
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12347
val parents : inference -> Metis_Thm.thm list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12348
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12349
val inferenceToThm : inference -> Metis_Thm.thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12350
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12351
val thmToInference : Metis_Thm.thm -> inference
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12352
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12353
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12354
(* Reconstructing whole proofs.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12355
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12356
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12357
val proof : Metis_Thm.thm -> proof
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12358
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12359
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12360
(* Free variables.                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12361
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12362
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12363
val freeIn : Metis_Term.var -> proof -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12364
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12365
val freeVars : proof -> Metis_NameSet.set
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12366
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12367
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12368
(* Printing.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12369
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12370
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12371
val ppInference : inference Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12372
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12373
val inferenceToString : inference -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12374
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12375
val pp : proof Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12376
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12377
val toString : proof -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12378
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12379
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12380
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12381
(**** Original file: src/Proof.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12382
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12383
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12384
(* PROOFS IN FIRST ORDER LOGIC                                               *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12385
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12386
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12387
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12388
structure Metis_Proof :> Metis_Proof =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12389
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12390
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12391
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12392
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12393
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12394
(* A type of first order logic proofs.                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12395
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12396
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12397
datatype inference =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12398
    Axiom of Metis_LiteralSet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12399
  | Assume of Metis_Atom.atom
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12400
  | Metis_Subst of Metis_Subst.subst * Metis_Thm.thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12401
  | Resolve of Metis_Atom.atom * Metis_Thm.thm * Metis_Thm.thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12402
  | Refl of Metis_Term.term
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12403
  | Equality of Metis_Literal.literal * Metis_Term.path * Metis_Term.term;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12404
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12405
type proof = (Metis_Thm.thm * inference) list;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12406
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12407
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12408
(* Printing.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12409
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12410
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12411
fun inferenceType (Axiom _) = Metis_Thm.Axiom
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12412
  | inferenceType (Assume _) = Metis_Thm.Assume
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12413
  | inferenceType (Metis_Subst _) = Metis_Thm.Metis_Subst
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12414
  | inferenceType (Resolve _) = Metis_Thm.Resolve
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12415
  | inferenceType (Refl _) = Metis_Thm.Refl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12416
  | inferenceType (Equality _) = Metis_Thm.Equality;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12418
local
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12419
  fun ppAssume atm = Metis_Print.sequence Metis_Print.break (Metis_Atom.pp atm);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12420
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12421
  fun ppSubst ppThm (sub,thm) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12422
      Metis_Print.sequence Metis_Print.break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12423
        (Metis_Print.inconsistentBlock 1
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12424
           [Metis_Print.ppString "{",
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12425
            Metis_Print.ppOp2 " =" Metis_Print.ppString Metis_Subst.pp ("sub",sub),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12426
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12427
            Metis_Print.break,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12428
            Metis_Print.ppOp2 " =" Metis_Print.ppString ppThm ("thm",thm),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12429
            Metis_Print.ppString "}"]);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12430
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12431
  fun ppResolve ppThm (res,pos,neg) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12432
      Metis_Print.sequence Metis_Print.break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12433
        (Metis_Print.inconsistentBlock 1
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12434
           [Metis_Print.ppString "{",
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12435
            Metis_Print.ppOp2 " =" Metis_Print.ppString Metis_Atom.pp ("res",res),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12436
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12437
            Metis_Print.break,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12438
            Metis_Print.ppOp2 " =" Metis_Print.ppString ppThm ("pos",pos),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12439
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12440
            Metis_Print.break,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12441
            Metis_Print.ppOp2 " =" Metis_Print.ppString ppThm ("neg",neg),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12442
            Metis_Print.ppString "}"]);
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12443
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12444
  fun ppRefl tm = Metis_Print.sequence Metis_Print.break (Metis_Term.pp tm);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12445
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12446
  fun ppEquality (lit,path,res) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12447
      Metis_Print.sequence Metis_Print.break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12448
        (Metis_Print.inconsistentBlock 1
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12449
           [Metis_Print.ppString "{",
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12450
            Metis_Print.ppOp2 " =" Metis_Print.ppString Metis_Literal.pp ("lit",lit),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12451
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12452
            Metis_Print.break,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12453
            Metis_Print.ppOp2 " =" Metis_Print.ppString Metis_Term.ppPath ("path",path),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12454
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12455
            Metis_Print.break,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12456
            Metis_Print.ppOp2 " =" Metis_Print.ppString Metis_Term.pp ("res",res),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12457
            Metis_Print.ppString "}"]);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12458
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12459
  fun ppInf ppAxiom ppThm inf =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12460
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12461
        val infString = Metis_Thm.inferenceTypeToString (inferenceType inf)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12462
      in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12463
        Metis_Print.inconsistentBlock 2
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12464
          [Metis_Print.ppString infString,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12465
           (case inf of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12466
              Axiom cl => ppAxiom cl
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12467
            | Assume x => ppAssume x
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12468
            | Metis_Subst x => ppSubst ppThm x
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12469
            | Resolve x => ppResolve ppThm x
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12470
            | Refl x => ppRefl x
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12471
            | Equality x => ppEquality x)]
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12472
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12473
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12474
  fun ppAxiom cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12475
      Metis_Print.sequence
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12476
        Metis_Print.break
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12477
        (Metis_Print.ppMap
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12478
           Metis_LiteralSet.toList
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12479
           (Metis_Print.ppBracket "{" "}" (Metis_Print.ppOpList "," Metis_Literal.pp)) cl);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12480
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12481
  val ppInference = ppInf ppAxiom Metis_Thm.pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12482
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12483
  fun pp prf =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12484
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12485
        fun thmString n = "(" ^ Int.toString n ^ ")"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12486
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12487
        val prf = enumerate prf
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12488
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12489
        fun ppThm th =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12490
            Metis_Print.ppString
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12491
            let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12492
              val cl = Metis_Thm.clause th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12493
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12494
              fun pred (_,(th',_)) = Metis_LiteralSet.equal (Metis_Thm.clause th') cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12495
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12496
              case List.find pred prf of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12497
                NONE => "(?)"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12498
              | SOME (n,_) => thmString n
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12499
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12500
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12501
        fun ppStep (n,(th,inf)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12502
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12503
              val s = thmString n
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12504
            in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12505
              Metis_Print.sequence
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12506
                (Metis_Print.consistentBlock (1 + size s)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12507
                   [Metis_Print.ppString (s ^ " "),
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12508
                    Metis_Thm.pp th,
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12509
                    Metis_Print.breaks 2,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12510
                    Metis_Print.ppBracket "[" "]" (ppInf (K Metis_Print.skip) ppThm) inf])
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12511
                Metis_Print.newline
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12512
            end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12513
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12514
        Metis_Print.consistentBlock 0
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12515
          [Metis_Print.ppString "START OF PROOF",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12516
           Metis_Print.newline,
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 12517
           Metis_Print.program (List.map ppStep prf),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12518
           Metis_Print.ppString "END OF PROOF"]
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12519
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12520
(*MetisDebug
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12521
      handle Error err => raise Bug ("Metis_Proof.pp: shouldn't fail:\n" ^ err);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12522
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12523
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12524
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12525
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12526
val inferenceToString = Metis_Print.toString ppInference;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12527
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12528
val toString = Metis_Print.toString pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12529
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12530
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12531
(* Reconstructing single inferences.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12532
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12533
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 12534
fun parents (Axiom _) = []
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 12535
  | parents (Assume _) = []
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12536
  | parents (Metis_Subst (_,th)) = [th]
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 12537
  | parents (Resolve (_,th,th')) = [th,th']
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 12538
  | parents (Refl _) = []
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 12539
  | parents (Equality _) = [];
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 12540
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12541
fun inferenceToThm (Axiom cl) = Metis_Thm.axiom cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12542
  | inferenceToThm (Assume atm) = Metis_Thm.assume (true,atm)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12543
  | inferenceToThm (Metis_Subst (sub,th)) = Metis_Thm.subst sub th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12544
  | inferenceToThm (Resolve (atm,th,th')) = Metis_Thm.resolve (true,atm) th th'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12545
  | inferenceToThm (Refl tm) = Metis_Thm.refl tm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12546
  | inferenceToThm (Equality (lit,path,r)) = Metis_Thm.equality lit path r;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12547
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12548
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12549
  fun reconstructSubst cl cl' =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12550
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12551
        fun recon [] =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12552
            let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12553
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12554
              val () = Metis_Print.trace Metis_LiteralSet.pp "reconstructSubst: cl" cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12555
              val () = Metis_Print.trace Metis_LiteralSet.pp "reconstructSubst: cl'" cl'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12556
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12557
            in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12558
              raise Bug "can't reconstruct Metis_Subst rule"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12559
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12560
          | recon (([],sub) :: others) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12561
            if Metis_LiteralSet.equal (Metis_LiteralSet.subst sub cl) cl' then sub
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12562
            else recon others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12563
          | recon ((lit :: lits, sub) :: others) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12564
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12565
              fun checkLit (lit',acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12566
                  case total (Metis_Literal.match sub lit) lit' of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12567
                    NONE => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12568
                  | SOME sub => (lits,sub) :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12569
            in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12570
              recon (Metis_LiteralSet.foldl checkLit others cl')
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12571
            end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12572
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12573
        Metis_Subst.normalize (recon [(Metis_LiteralSet.toList cl, Metis_Subst.empty)])
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12574
      end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12575
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12576
      handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12577
        raise Bug ("Metis_Proof.recontructSubst: shouldn't fail:\n" ^ err);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12578
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12579
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12580
  fun reconstructResolvant cl1 cl2 cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12581
      (if not (Metis_LiteralSet.subset cl1 cl) then
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12582
         Metis_LiteralSet.pick (Metis_LiteralSet.difference cl1 cl)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12583
       else if not (Metis_LiteralSet.subset cl2 cl) then
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12584
         Metis_Literal.negate (Metis_LiteralSet.pick (Metis_LiteralSet.difference cl2 cl))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12585
       else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12586
         (* A useless resolution, but we must reconstruct it anyway *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12587
         let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12588
           val cl1' = Metis_LiteralSet.negate cl1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12589
           and cl2' = Metis_LiteralSet.negate cl2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12590
           val lits = Metis_LiteralSet.intersectList [cl1,cl1',cl2,cl2']
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12591
         in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12592
           if not (Metis_LiteralSet.null lits) then Metis_LiteralSet.pick lits
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12593
           else raise Bug "can't reconstruct Resolve rule"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12594
         end)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12595
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12596
      handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12597
        raise Bug ("Metis_Proof.recontructResolvant: shouldn't fail:\n" ^ err);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12598
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12599
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12600
  fun reconstructEquality cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12601
      let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12602
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12603
        val () = Metis_Print.trace Metis_LiteralSet.pp "Metis_Proof.reconstructEquality: cl" cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12604
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12605
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12606
        fun sync s t path (f,a) (f',a') =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12607
            if not (Metis_Name.equal f f' andalso length a = length a') then NONE
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12608
            else
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12609
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12610
                val itms = enumerate (zip a a')
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12611
              in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12612
                case List.filter (not o uncurry Metis_Term.equal o snd) itms of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12613
                  [(i,(tm,tm'))] =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12614
                  let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12615
                    val path = i :: path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12616
                  in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12617
                    if Metis_Term.equal tm s andalso Metis_Term.equal tm' t then
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12618
                      SOME (List.rev path)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12619
                    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12620
                      case (tm,tm') of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12621
                        (Metis_Term.Fn f_a, Metis_Term.Fn f_a') => sync s t path f_a f_a'
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12622
                      | _ => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12623
                  end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12624
                | _ => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12625
              end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12626
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12627
        fun recon (neq,(pol,atm),(pol',atm')) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12628
            if pol = pol' then NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12629
            else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12630
              let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12631
                val (s,t) = Metis_Literal.destNeq neq
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12632
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12633
                val path =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12634
                    if not (Metis_Term.equal s t) then sync s t [] atm atm'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12635
                    else if not (Metis_Atom.equal atm atm') then NONE
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12636
                    else Metis_Atom.find (Metis_Term.equal s) atm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12637
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12638
                case path of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12639
                  SOME path => SOME ((pol',atm),path,t)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12640
                | NONE => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12641
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12642
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12643
        val candidates =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12644
            case List.partition Metis_Literal.isNeq (Metis_LiteralSet.toList cl) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12645
              ([l1],[l2,l3]) => [(l1,l2,l3),(l1,l3,l2)]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12646
            | ([l1,l2],[l3]) => [(l1,l2,l3),(l1,l3,l2),(l2,l1,l3),(l2,l3,l1)]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12647
            | ([l1],[l2]) => [(l1,l1,l2),(l1,l2,l1)]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12648
            | _ => raise Bug "reconstructEquality: malformed"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12649
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12650
(*MetisTrace3
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12651
        val ppCands =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12652
            Metis_Print.ppList (Metis_Print.ppTriple Metis_Literal.pp Metis_Literal.pp Metis_Literal.pp)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12653
        val () = Metis_Print.trace ppCands
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12654
                   "Metis_Proof.reconstructEquality: candidates" candidates
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12655
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12656
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12657
        case first recon candidates of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12658
          SOME info => info
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12659
        | NONE => raise Bug "can't reconstruct Equality rule"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12660
      end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12661
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12662
      handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12663
        raise Bug ("Metis_Proof.recontructEquality: shouldn't fail:\n" ^ err);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12664
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12665
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12666
  fun reconstruct cl (Metis_Thm.Axiom,[]) = Axiom cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12667
    | reconstruct cl (Metis_Thm.Assume,[]) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12668
      (case Metis_LiteralSet.findl Metis_Literal.positive cl of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12669
         SOME (_,atm) => Assume atm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12670
       | NONE => raise Bug "malformed Assume inference")
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12671
    | reconstruct cl (Metis_Thm.Metis_Subst,[th]) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12672
      Metis_Subst (reconstructSubst (Metis_Thm.clause th) cl, th)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12673
    | reconstruct cl (Metis_Thm.Resolve,[th1,th2]) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12674
      let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12675
        val cl1 = Metis_Thm.clause th1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12676
        and cl2 = Metis_Thm.clause th2
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12677
        val (pol,atm) = reconstructResolvant cl1 cl2 cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12678
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12679
        if pol then Resolve (atm,th1,th2) else Resolve (atm,th2,th1)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12680
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12681
    | reconstruct cl (Metis_Thm.Refl,[]) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12682
      (case Metis_LiteralSet.findl (K true) cl of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12683
         SOME lit => Refl (Metis_Literal.destRefl lit)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12684
       | NONE => raise Bug "malformed Refl inference")
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12685
    | reconstruct cl (Metis_Thm.Equality,[]) = Equality (reconstructEquality cl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12686
    | reconstruct _ _ = raise Bug "malformed inference";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12687
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12688
  fun thmToInference th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12689
      let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12690
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12691
        val () = Metis_Print.trace Metis_Thm.pp "Metis_Proof.thmToInference: th" th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12692
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12693
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12694
        val cl = Metis_Thm.clause th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12695
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12696
        val thmInf = Metis_Thm.inference th
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12697
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12698
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12699
        val ppThmInf = Metis_Print.ppPair Metis_Thm.ppInferenceType (Metis_Print.ppList Metis_Thm.pp)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12700
        val () = Metis_Print.trace ppThmInf "Metis_Proof.thmToInference: thmInf" thmInf
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12701
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12702
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12703
        val inf = reconstruct cl thmInf
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12704
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12705
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12706
        val () = Metis_Print.trace ppInference "Metis_Proof.thmToInference: inf" inf
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12707
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12708
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12709
        val () =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12710
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12711
              val th' = inferenceToThm inf
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12712
            in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12713
              if Metis_LiteralSet.equal (Metis_Thm.clause th') cl then ()
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12714
              else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12715
                raise
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12716
                  Bug
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12717
                    ("Metis_Proof.thmToInference: bad inference reconstruction:" ^
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12718
                     "\n  th = " ^ Metis_Thm.toString th ^
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12719
                     "\n  inf = " ^ inferenceToString inf ^
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12720
                     "\n  inf th = " ^ Metis_Thm.toString th')
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12721
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12722
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12723
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12724
        inf
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12725
      end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12726
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12727
      handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12728
        raise Bug ("Metis_Proof.thmToInference: shouldn't fail:\n" ^ err);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12729
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12730
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12731
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12732
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12733
(* Reconstructing whole proofs.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12734
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12735
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12736
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12737
  val emptyThms : Metis_Thm.thm Metis_LiteralSetMap.map = Metis_LiteralSetMap.new ();
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12738
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12739
  fun addThms (th,ths) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12740
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12741
        val cl = Metis_Thm.clause th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12742
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12743
        if Metis_LiteralSetMap.inDomain cl ths then ths
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12744
        else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12745
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12746
            val (_,pars) = Metis_Thm.inference th
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12747
            val ths = List.foldl addThms ths pars
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12748
          in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12749
            if Metis_LiteralSetMap.inDomain cl ths then ths
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12750
            else Metis_LiteralSetMap.insert ths (cl,th)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12751
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12752
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12753
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12754
  fun mkThms th = addThms (th,emptyThms);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12755
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12756
  fun addProof (th,(ths,acc)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12757
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12758
        val cl = Metis_Thm.clause th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12759
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12760
        case Metis_LiteralSetMap.peek ths cl of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12761
          NONE => (ths,acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12762
        | SOME th =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12763
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12764
            val (_,pars) = Metis_Thm.inference th
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12765
            val (ths,acc) = List.foldl addProof (ths,acc) pars
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12766
            val ths = Metis_LiteralSetMap.delete ths cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12767
            val acc = (th, thmToInference th) :: acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12768
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12769
            (ths,acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12770
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12771
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12772
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12773
  fun mkProof ths th =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12774
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12775
        val (ths,acc) = addProof (th,(ths,[]))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12776
(*MetisTrace4
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12777
        val () = Metis_Print.trace Metis_Print.ppInt "Metis_Proof.proof: unnecessary clauses" (Metis_LiteralSetMap.size ths)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12778
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12779
      in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12780
        List.rev acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12781
      end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12782
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12783
  fun proof th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12784
      let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12785
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12786
        val () = Metis_Print.trace Metis_Thm.pp "Metis_Proof.proof: th" th
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12787
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12788
        val ths = mkThms th
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12789
        val infs = mkProof ths th
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12790
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12791
        val () = Metis_Print.trace Metis_Print.ppInt "Metis_Proof.proof: size" (length infs)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12792
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12793
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12794
        infs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12795
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12796
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12797
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12798
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12799
(* Free variables.                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12800
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12801
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12802
fun freeIn v =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12803
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12804
      fun free th_inf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12805
          case th_inf of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12806
            (_, Axiom lits) => Metis_LiteralSet.freeIn v lits
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12807
          | (_, Assume atm) => Metis_Atom.freeIn v atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12808
          | (th, Metis_Subst _) => Metis_Thm.freeIn v th
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12809
          | (_, Resolve _) => false
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12810
          | (_, Refl tm) => Metis_Term.freeIn v tm
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12811
          | (_, Equality (lit,_,tm)) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12812
            Metis_Literal.freeIn v lit orelse Metis_Term.freeIn v tm
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12813
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12814
      List.exists free
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12815
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12816
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12817
val freeVars =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12818
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12819
      fun inc (th_inf,set) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12820
          Metis_NameSet.union set
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12821
          (case th_inf of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12822
             (_, Axiom lits) => Metis_LiteralSet.freeVars lits
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12823
           | (_, Assume atm) => Metis_Atom.freeVars atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12824
           | (th, Metis_Subst _) => Metis_Thm.freeVars th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12825
           | (_, Resolve _) => Metis_NameSet.empty
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12826
           | (_, Refl tm) => Metis_Term.freeVars tm
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12827
           | (_, Equality (lit,_,tm)) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12828
             Metis_NameSet.union (Metis_Literal.freeVars lit) (Metis_Term.freeVars tm))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12829
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12830
      List.foldl inc Metis_NameSet.empty
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12831
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12832
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12833
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12834
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12835
(**** Original file: src/Rule.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12836
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12837
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12838
(* DERIVED RULES FOR CREATING FIRST ORDER LOGIC THEOREMS                     *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12839
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12840
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12841
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12842
signature Metis_Rule =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12843
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12844
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12845
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12846
(* An equation consists of two terms (t,u) plus a theorem (stronger than)    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12847
(* t = u \/ C.                                                               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12848
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12849
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12850
type equation = (Metis_Term.term * Metis_Term.term) * Metis_Thm.thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12851
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12852
val ppEquation : equation Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12853
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12854
val equationToString : equation -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12855
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12856
(* Returns t = u if the equation theorem contains this literal *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12857
val equationLiteral : equation -> Metis_Literal.literal option
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12858
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12859
val reflEqn : Metis_Term.term -> equation
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12860
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12861
val symEqn : equation -> equation
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12862
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12863
val transEqn : equation -> equation -> equation
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12864
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12865
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12866
(* A conversion takes a term t and either:                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12867
(* 1. Returns a term u together with a theorem (stronger than) t = u \/ C.   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12868
(* 2. Raises an Error exception.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12869
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12870
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12871
type conv = Metis_Term.term -> Metis_Term.term * Metis_Thm.thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12872
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12873
val allConv : conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12874
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12875
val noConv : conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12876
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12877
val thenConv : conv -> conv -> conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12878
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12879
val orelseConv : conv -> conv -> conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12880
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12881
val tryConv : conv -> conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12882
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12883
val repeatConv : conv -> conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12884
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12885
val firstConv : conv list -> conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12886
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12887
val everyConv : conv list -> conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12888
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12889
val rewrConv : equation -> Metis_Term.path -> conv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12890
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12891
val pathConv : conv -> Metis_Term.path -> conv
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12892
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12893
val subtermConv : conv -> int -> conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12894
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12895
val subtermsConv : conv -> conv  (* All function arguments *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12896
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12897
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12898
(* Applying a conversion to every subterm, with some traversal strategy.     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12899
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12900
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12901
val bottomUpConv : conv -> conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12902
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12903
val topDownConv : conv -> conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12904
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12905
val repeatTopDownConv : conv -> conv  (* useful for rewriting *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12906
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12907
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12908
(* A literule (bad pun) takes a literal L and either:                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12909
(* 1. Returns a literal L' with a theorem (stronger than) ~L \/ L' \/ C.     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12910
(* 2. Raises an Error exception.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12911
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12912
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12913
type literule = Metis_Literal.literal -> Metis_Literal.literal * Metis_Thm.thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12914
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12915
val allLiterule : literule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12916
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12917
val noLiterule : literule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12918
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12919
val thenLiterule : literule -> literule -> literule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12920
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12921
val orelseLiterule : literule -> literule -> literule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12922
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12923
val tryLiterule : literule -> literule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12924
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12925
val repeatLiterule : literule -> literule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12926
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12927
val firstLiterule : literule list -> literule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12928
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12929
val everyLiterule : literule list -> literule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12930
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12931
val rewrLiterule : equation -> Metis_Term.path -> literule
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12932
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12933
val pathLiterule : conv -> Metis_Term.path -> literule
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12934
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12935
val argumentLiterule : conv -> int -> literule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12936
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12937
val allArgumentsLiterule : conv -> literule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12938
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12939
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12940
(* A rule takes one theorem and either deduces another or raises an Error    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12941
(* exception.                                                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12942
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12943
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12944
type rule = Metis_Thm.thm -> Metis_Thm.thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12945
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12946
val allRule : rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12947
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12948
val noRule : rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12949
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12950
val thenRule : rule -> rule -> rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12951
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12952
val orelseRule : rule -> rule -> rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12953
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12954
val tryRule : rule -> rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12955
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12956
val changedRule : rule -> rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12957
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12958
val repeatRule : rule -> rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12959
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12960
val firstRule : rule list -> rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12961
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12962
val everyRule : rule list -> rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12963
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12964
val literalRule : literule -> Metis_Literal.literal -> rule
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12965
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12966
val rewrRule : equation -> Metis_Literal.literal -> Metis_Term.path -> rule
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12967
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12968
val pathRule : conv -> Metis_Literal.literal -> Metis_Term.path -> rule
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12969
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12970
val literalsRule : literule -> Metis_LiteralSet.set -> rule
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12971
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12972
val allLiteralsRule : literule -> rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12973
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12974
val convRule : conv -> rule  (* All arguments of all literals *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12975
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12976
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12977
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12978
(* --------- reflexivity                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12979
(*   x = x                                                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12980
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12981
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12982
val reflexivityRule : Metis_Term.term -> Metis_Thm.thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12983
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12984
val reflexivity : Metis_Thm.thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12985
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12986
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12987
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12988
(* --------------------- symmetry                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12989
(*   ~(x = y) \/ y = x                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12990
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12991
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12992
val symmetryRule : Metis_Term.term -> Metis_Term.term -> Metis_Thm.thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12993
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12994
val symmetry : Metis_Thm.thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12995
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12996
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12997
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12998
(* --------------------------------- transitivity                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12999
(*   ~(x = y) \/ ~(y = z) \/ x = z                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13000
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13001
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13002
val transitivity : Metis_Thm.thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13003
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13004
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13005
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13006
(* ---------------------------------------------- functionCongruence (f,n)   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13007
(*   ~(x0 = y0) \/ ... \/ ~(x{n-1} = y{n-1}) \/                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13008
(*   f x0 ... x{n-1} = f y0 ... y{n-1}                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13009
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13010
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13011
val functionCongruence : Metis_Term.function -> Metis_Thm.thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13012
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13013
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13014
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13015
(* ---------------------------------------------- relationCongruence (R,n)   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13016
(*   ~(x0 = y0) \/ ... \/ ~(x{n-1} = y{n-1}) \/                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13017
(*   ~R x0 ... x{n-1} \/ R y0 ... y{n-1}                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13018
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13019
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13020
val relationCongruence : Metis_Atom.relation -> Metis_Thm.thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13021
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13022
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13023
(*   x = y \/ C                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13024
(* -------------- symEq (x = y)                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13025
(*   y = x \/ C                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13026
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13027
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13028
val symEq : Metis_Literal.literal -> rule
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13029
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13030
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13031
(*   ~(x = y) \/ C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13032
(* ----------------- symNeq ~(x = y)                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13033
(*   ~(y = x) \/ C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13034
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13035
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13036
val symNeq : Metis_Literal.literal -> rule
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13037
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13038
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13039
(* sym (x = y) = symEq (x = y)  /\  sym ~(x = y) = symNeq ~(x = y)           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13040
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13041
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13042
val sym : Metis_Literal.literal -> rule
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13043
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13044
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13045
(*   ~(x = x) \/ C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13046
(* ----------------- removeIrrefl                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13047
(*         C                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13048
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13049
(* where all irreflexive equalities.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13050
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13051
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13052
val removeIrrefl : rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13053
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13054
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13055
(*   x = y \/ y = x \/ C                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13056
(* ----------------------- removeSym                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13057
(*       x = y \/ C                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13058
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13059
(* where all duplicate copies of equalities and disequalities are removed.   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13060
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13061
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13062
val removeSym : rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13063
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13064
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13065
(*   ~(v = t) \/ C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13066
(* ----------------- expandAbbrevs                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13067
(*      C[t/v]                                                               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13068
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13069
(* where t must not contain any occurrence of the variable v.                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13070
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13071
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13072
val expandAbbrevs : rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13073
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13074
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13075
(* simplify = isTautology + expandAbbrevs + removeSym                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13076
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13077
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13078
val simplify : Metis_Thm.thm -> Metis_Thm.thm option
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13079
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13080
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13081
(*    C                                                                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13082
(* -------- freshVars                                                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13083
(*   C[s]                                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13084
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13085
(* where s is a renaming substitution chosen so that all of the variables in *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13086
(* C are replaced by fresh variables.                                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13087
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13088
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13089
val freshVars : rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13090
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13091
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13092
(*               C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13093
(* ---------------------------- factor                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13094
(*   C_s_1, C_s_2, ..., C_s_n                                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13095
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13096
(* where each s_i is a substitution that factors C, meaning that the theorem *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13097
(*                                                                           *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13098
(*   C_s_i = (removeIrrefl o removeSym o Metis_Thm.subst s_i) C                    *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13099
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13100
(* has fewer literals than C.                                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13101
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13102
(* Also, if s is any substitution that factors C, then one of the s_i will   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13103
(* result in a theorem C_s_i that strictly subsumes the theorem C_s.         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13104
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13105
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13106
val factor' : Metis_Thm.clause -> Metis_Subst.subst list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13107
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13108
val factor : Metis_Thm.thm -> Metis_Thm.thm list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13109
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13110
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13111
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 13112
(**** Original file: src/Rule.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13113
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13114
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13115
(* DERIVED RULES FOR CREATING FIRST ORDER LOGIC THEOREMS                     *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 13116
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13117
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13118
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13119
structure Metis_Rule :> Metis_Rule =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13120
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13121
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13122
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13123
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13124
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13125
(* Variable names.                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13126
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13127
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13128
val xVarName = Metis_Name.fromString "x";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13129
val xVar = Metis_Term.Var xVarName;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13130
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13131
val yVarName = Metis_Name.fromString "y";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13132
val yVar = Metis_Term.Var yVarName;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13133
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13134
val zVarName = Metis_Name.fromString "z";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13135
val zVar = Metis_Term.Var zVarName;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13136
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13137
fun xIVarName i = Metis_Name.fromString ("x" ^ Int.toString i);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13138
fun xIVar i = Metis_Term.Var (xIVarName i);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13139
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13140
fun yIVarName i = Metis_Name.fromString ("y" ^ Int.toString i);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13141
fun yIVar i = Metis_Term.Var (yIVarName i);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13142
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13143
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13144
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13145
(* --------- reflexivity                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13146
(*   x = x                                                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13147
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13148
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13149
fun reflexivityRule x = Metis_Thm.refl x;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13150
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13151
val reflexivity = reflexivityRule xVar;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13152
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13153
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13154
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13155
(* --------------------- symmetry                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13156
(*   ~(x = y) \/ y = x                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13157
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13158
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13159
fun symmetryRule x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13160
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13161
      val reflTh = reflexivityRule x
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13162
      val reflLit = Metis_Thm.destUnit reflTh
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13163
      val eqTh = Metis_Thm.equality reflLit [0] y
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13164
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13165
      Metis_Thm.resolve reflLit reflTh eqTh
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13166
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13167
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13168
val symmetry = symmetryRule xVar yVar;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13169
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13170
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13171
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13172
(* --------------------------------- transitivity                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13173
(*   ~(x = y) \/ ~(y = z) \/ x = z                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13174
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13175
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13176
val transitivity =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13177
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13178
      val eqTh = Metis_Thm.equality (Metis_Literal.mkEq (yVar,zVar)) [0] xVar
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13179
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13180
      Metis_Thm.resolve (Metis_Literal.mkEq (yVar,xVar)) symmetry eqTh
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13181
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13182
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13183
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13184
(*   x = y \/ C                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13185
(* -------------- symEq (x = y)                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13186
(*   y = x \/ C                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13187
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13188
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13189
fun symEq lit th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13190
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13191
      val (x,y) = Metis_Literal.destEq lit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13192
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13193
      if Metis_Term.equal x y then th
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13194
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13195
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13196
          val sub = Metis_Subst.fromList [(xVarName,x),(yVarName,y)]
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 13197
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13198
          val symTh = Metis_Thm.subst sub symmetry
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13199
        in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13200
          Metis_Thm.resolve lit th symTh
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13201
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13202
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13203
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13204
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13205
(* An equation consists of two terms (t,u) plus a theorem (stronger than)    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13206
(* t = u \/ C.                                                               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13207
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13208
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13209
type equation = (Metis_Term.term * Metis_Term.term) * Metis_Thm.thm;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13210
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 13211
fun ppEquation ((_,th) : equation) = Metis_Thm.pp th;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 13212
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 13213
val equationToString = Metis_Print.toString ppEquation;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13214
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13215
fun equationLiteral (t_u,th) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13216
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13217
      val lit = Metis_Literal.mkEq t_u
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13218
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13219
      if Metis_LiteralSet.member lit (Metis_Thm.clause th) then SOME lit else NONE
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13220
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13221
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13222
fun reflEqn t = ((t,t), Metis_Thm.refl t);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13223
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13224
fun symEqn (eqn as ((t,u), th)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13225
    if Metis_Term.equal t u then eqn
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13226
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13227
      ((u,t),
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13228
       case equationLiteral eqn of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13229
         SOME t_u => symEq t_u th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13230
       | NONE => th);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13231
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13232
fun transEqn (eqn1 as ((x,y), th1)) (eqn2 as ((_,z), th2)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13233
    if Metis_Term.equal x y then eqn2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13234
    else if Metis_Term.equal y z then eqn1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13235
    else if Metis_Term.equal x z then reflEqn x
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13236
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13237
      ((x,z),
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13238
       case equationLiteral eqn1 of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13239
         NONE => th1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13240
       | SOME x_y =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13241
         case equationLiteral eqn2 of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13242
           NONE => th2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13243
         | SOME y_z =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13244
           let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13245
             val sub = Metis_Subst.fromList [(xVarName,x),(yVarName,y),(zVarName,z)]
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13246
             val th = Metis_Thm.subst sub transitivity
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13247
             val th = Metis_Thm.resolve x_y th1 th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13248
             val th = Metis_Thm.resolve y_z th2 th
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13249
           in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13250
             th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13251
           end);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13252
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13253
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13254
val transEqn = fn eqn1 => fn eqn2 =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13255
    transEqn eqn1 eqn2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13256
    handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13257
      raise Error ("Metis_Rule.transEqn:\neqn1 = " ^ equationToString eqn1 ^
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13258
                   "\neqn2 = " ^ equationToString eqn2 ^ "\n" ^ err);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13259
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13260
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13261
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13262
(* A conversion takes a term t and either:                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13263
(* 1. Returns a term u together with a theorem (stronger than) t = u \/ C.   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13264
(* 2. Raises an Error exception.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13265
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13266
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13267
type conv = Metis_Term.term -> Metis_Term.term * Metis_Thm.thm;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13268
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13269
fun allConv tm = (tm, Metis_Thm.refl tm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13270
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13271
val noConv : conv = fn _ => raise Error "noConv";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13272
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 13273
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13274
fun traceConv s conv tm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13275
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13276
      val res as (tm',th) = conv tm
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 13277
      val () = trace (s ^ ": " ^ Metis_Term.toString tm ^ " --> " ^
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13278
                      Metis_Term.toString tm' ^ " " ^ Metis_Thm.toString th ^ "\n")
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13279
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13280
      res
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13281
    end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13282
    handle Error err =>
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 13283
      (trace (s ^ ": " ^ Metis_Term.toString tm ^ " --> Error: " ^ err ^ "\n");
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13284
       raise Error (s ^ ": " ^ err));
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 13285
*)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13286
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13287
fun thenConvTrans tm (tm',th1) (tm'',th2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13288
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13289
      val eqn1 = ((tm,tm'),th1)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13290
      and eqn2 = ((tm',tm''),th2)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13291
      val (_,th) = transEqn eqn1 eqn2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13292
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13293
      (tm'',th)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13294
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13295
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13296
fun thenConv conv1 conv2 tm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13297
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13298
      val res1 as (tm',_) = conv1 tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13299
      val res2 = conv2 tm'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13300
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13301
      thenConvTrans tm res1 res2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13302
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13303
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13304
fun orelseConv (conv1 : conv) conv2 tm = conv1 tm handle Error _ => conv2 tm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13305
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13306
fun tryConv conv = orelseConv conv allConv;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13307
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13308
fun changedConv conv tm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13309
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13310
      val res as (tm',_) = conv tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13311
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13312
      if tm = tm' then raise Error "changedConv" else res
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13313
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13314
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13315
fun repeatConv conv tm = tryConv (thenConv conv (repeatConv conv)) tm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13316
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13317
fun firstConv [] _ = raise Error "firstConv"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13318
  | firstConv [conv] tm = conv tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13319
  | firstConv (conv :: convs) tm = orelseConv conv (firstConv convs) tm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13320
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13321
fun everyConv [] tm = allConv tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13322
  | everyConv [conv] tm = conv tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13323
  | everyConv (conv :: convs) tm = thenConv conv (everyConv convs) tm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13324
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13325
fun rewrConv (eqn as ((x,y), eqTh)) path tm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13326
    if Metis_Term.equal x y then allConv tm
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 13327
    else if List.null path then (y,eqTh)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13328
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13329
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13330
        val reflTh = Metis_Thm.refl tm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13331
        val reflLit = Metis_Thm.destUnit reflTh
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13332
        val th = Metis_Thm.equality reflLit (1 :: path) y
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13333
        val th = Metis_Thm.resolve reflLit reflTh th
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13334
        val th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13335
            case equationLiteral eqn of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13336
              NONE => th
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13337
            | SOME x_y => Metis_Thm.resolve x_y eqTh th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13338
        val tm' = Metis_Term.replace tm (path,y)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13339
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13340
        (tm',th)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13341
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13342
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13343
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13344
val rewrConv = fn eqn as ((x,y),eqTh) => fn path => fn tm =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13345
    rewrConv eqn path tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13346
    handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13347
      raise Error ("Metis_Rule.rewrConv:\nx = " ^ Metis_Term.toString x ^
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13348
                   "\ny = " ^ Metis_Term.toString y ^
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13349
                   "\neqTh = " ^ Metis_Thm.toString eqTh ^
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13350
                   "\npath = " ^ Metis_Term.pathToString path ^
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13351
                   "\ntm = " ^ Metis_Term.toString tm ^ "\n" ^ err);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13352
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13353
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13354
fun pathConv conv path tm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13355
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13356
      val x = Metis_Term.subterm tm path
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13357
      val (y,th) = conv x
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13358
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13359
      rewrConv ((x,y),th) path tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13360
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13361
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13362
fun subtermConv conv i = pathConv conv [i];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13363
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13364
fun subtermsConv _ (tm as Metis_Term.Var _) = allConv tm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13365
  | subtermsConv conv (tm as Metis_Term.Fn (_,a)) =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 13366
    everyConv (List.map (subtermConv conv) (interval 0 (length a))) tm;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13367
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13368
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13369
(* Applying a conversion to every subterm, with some traversal strategy.     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13370
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13371
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13372
fun bottomUpConv conv tm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13373
    thenConv (subtermsConv (bottomUpConv conv)) (repeatConv conv) tm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13374
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13375
fun topDownConv conv tm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13376
    thenConv (repeatConv conv) (subtermsConv (topDownConv conv)) tm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13377
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13378
fun repeatTopDownConv conv =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13379
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13380
      fun f tm = thenConv (repeatConv conv) g tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13381
      and g tm = thenConv (subtermsConv f) h tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13382
      and h tm = tryConv (thenConv conv f) tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13383
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13384
      f
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13385
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13386
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13387
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13388
val repeatTopDownConv = fn conv => fn tm =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13389
    repeatTopDownConv conv tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13390
    handle Error err => raise Error ("repeatTopDownConv: " ^ err);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13391
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13392
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13393
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13394
(* A literule (bad pun) takes a literal L and either:                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13395
(* 1. Returns a literal L' with a theorem (stronger than) ~L \/ L' \/ C.     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13396
(* 2. Raises an Error exception.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13397
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13398
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13399
type literule = Metis_Literal.literal -> Metis_Literal.literal * Metis_Thm.thm;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13400
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13401
fun allLiterule lit = (lit, Metis_Thm.assume lit);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13402
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13403
val noLiterule : literule = fn _ => raise Error "noLiterule";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13404
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13405
fun thenLiterule literule1 literule2 lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13406
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13407
      val res1 as (lit',th1) = literule1 lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13408
      val res2 as (lit'',th2) = literule2 lit'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13409
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13410
      if Metis_Literal.equal lit lit' then res2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13411
      else if Metis_Literal.equal lit' lit'' then res1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13412
      else if Metis_Literal.equal lit lit'' then allLiterule lit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13413
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13414
        (lit'',
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13415
         if not (Metis_Thm.member lit' th1) then th1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13416
         else if not (Metis_Thm.negateMember lit' th2) then th2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13417
         else Metis_Thm.resolve lit' th1 th2)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13418
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13419
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13420
fun orelseLiterule (literule1 : literule) literule2 lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13421
    literule1 lit handle Error _ => literule2 lit;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13422
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13423
fun tryLiterule literule = orelseLiterule literule allLiterule;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13424
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13425
fun changedLiterule literule lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13426
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13427
      val res as (lit',_) = literule lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13428
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13429
      if lit = lit' then raise Error "changedLiterule" else res
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13430
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13431
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13432
fun repeatLiterule literule lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13433
    tryLiterule (thenLiterule literule (repeatLiterule literule)) lit;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13434
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13435
fun firstLiterule [] _ = raise Error "firstLiterule"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13436
  | firstLiterule [literule] lit = literule lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13437
  | firstLiterule (literule :: literules) lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13438
    orelseLiterule literule (firstLiterule literules) lit;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13439
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13440
fun everyLiterule [] lit = allLiterule lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13441
  | everyLiterule [literule] lit = literule lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13442
  | everyLiterule (literule :: literules) lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13443
    thenLiterule literule (everyLiterule literules) lit;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13444
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13445
fun rewrLiterule (eqn as ((x,y),eqTh)) path lit =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13446
    if Metis_Term.equal x y then allLiterule lit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13447
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13448
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13449
        val th = Metis_Thm.equality lit path y
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13450
        val th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13451
            case equationLiteral eqn of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13452
              NONE => th
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13453
            | SOME x_y => Metis_Thm.resolve x_y eqTh th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13454
        val lit' = Metis_Literal.replace lit (path,y)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13455
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13456
        (lit',th)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13457
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13458
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13459
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13460
val rewrLiterule = fn eqn => fn path => fn lit =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13461
    rewrLiterule eqn path lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13462
    handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13463
      raise Error ("Metis_Rule.rewrLiterule:\neqn = " ^ equationToString eqn ^
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13464
                   "\npath = " ^ Metis_Term.pathToString path ^
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13465
                   "\nlit = " ^ Metis_Literal.toString lit ^ "\n" ^ err);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13466
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13467
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13468
fun pathLiterule conv path lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13469
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13470
      val tm = Metis_Literal.subterm lit path
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13471
      val (tm',th) = conv tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13472
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13473
      rewrLiterule ((tm,tm'),th) path lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13474
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13475
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13476
fun argumentLiterule conv i = pathLiterule conv [i];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13477
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13478
fun allArgumentsLiterule conv lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13479
    everyLiterule
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 13480
      (List.map (argumentLiterule conv) (interval 0 (Metis_Literal.arity lit))) lit;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13481
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13482
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13483
(* A rule takes one theorem and either deduces another or raises an Error    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13484
(* exception.                                                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13485
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13486
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13487
type rule = Metis_Thm.thm -> Metis_Thm.thm;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13488
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13489
val allRule : rule = fn th => th;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13490
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13491
val noRule : rule = fn _ => raise Error "noRule";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13492
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13493
fun thenRule (rule1 : rule) (rule2 : rule) th = rule1 (rule2 th);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13494
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13495
fun orelseRule (rule1 : rule) rule2 th = rule1 th handle Error _ => rule2 th;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13496
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13497
fun tryRule rule = orelseRule rule allRule;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13498
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13499
fun changedRule rule th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13500
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13501
      val th' = rule th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13502
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13503
      if not (Metis_LiteralSet.equal (Metis_Thm.clause th) (Metis_Thm.clause th')) then th'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13504
      else raise Error "changedRule"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13505
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13506
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13507
fun repeatRule rule lit = tryRule (thenRule rule (repeatRule rule)) lit;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13508
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13509
fun firstRule [] _ = raise Error "firstRule"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13510
  | firstRule [rule] th = rule th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13511
  | firstRule (rule :: rules) th = orelseRule rule (firstRule rules) th;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13512
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13513
fun everyRule [] th = allRule th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13514
  | everyRule [rule] th = rule th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13515
  | everyRule (rule :: rules) th = thenRule rule (everyRule rules) th;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13516
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13517
fun literalRule literule lit th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13518
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13519
      val (lit',litTh) = literule lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13520
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13521
      if Metis_Literal.equal lit lit' then th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13522
      else if not (Metis_Thm.negateMember lit litTh) then litTh
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13523
      else Metis_Thm.resolve lit th litTh
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13524
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13525
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13526
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13527
val literalRule = fn literule => fn lit => fn th =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13528
    literalRule literule lit th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13529
    handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13530
      raise Error ("Metis_Rule.literalRule:\nlit = " ^ Metis_Literal.toString lit ^
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13531
                   "\nth = " ^ Metis_Thm.toString th ^ "\n" ^ err);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13532
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13533
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13534
fun rewrRule eqTh lit path = literalRule (rewrLiterule eqTh path) lit;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13535
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13536
fun pathRule conv lit path = literalRule (pathLiterule conv path) lit;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13537
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13538
fun literalsRule literule =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13539
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13540
      fun f (lit,th) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13541
          if Metis_Thm.member lit th then literalRule literule lit th else th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13542
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13543
      fn lits => fn th => Metis_LiteralSet.foldl f th lits
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13544
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13545
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13546
fun allLiteralsRule literule th = literalsRule literule (Metis_Thm.clause th) th;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13547
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13548
fun convRule conv = allLiteralsRule (allArgumentsLiterule conv);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13549
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13550
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13551
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13552
(* ---------------------------------------------- functionCongruence (f,n)   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13553
(*   ~(x0 = y0) \/ ... \/ ~(x{n-1} = y{n-1}) \/                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13554
(*   f x0 ... x{n-1} = f y0 ... y{n-1}                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13555
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13556
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13557
fun functionCongruence (f,n) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13558
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13559
      val xs = List.tabulate (n,xIVar)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13560
      and ys = List.tabulate (n,yIVar)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13561
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13562
      fun cong ((i,yi),(th,lit)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13563
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13564
            val path = [1,i]
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13565
            val th = Metis_Thm.resolve lit th (Metis_Thm.equality lit path yi)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13566
            val lit = Metis_Literal.replace lit (path,yi)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13567
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13568
            (th,lit)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13569
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13570
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13571
      val reflTh = Metis_Thm.refl (Metis_Term.Fn (f,xs))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13572
      val reflLit = Metis_Thm.destUnit reflTh
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13573
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 13574
      fst (List.foldl cong (reflTh,reflLit) (enumerate ys))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13575
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13576
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13577
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13578
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13579
(* ---------------------------------------------- relationCongruence (R,n)   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13580
(*   ~(x0 = y0) \/ ... \/ ~(x{n-1} = y{n-1}) \/                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13581
(*   ~R x0 ... x{n-1} \/ R y0 ... y{n-1}                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13582
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13583
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13584
fun relationCongruence (R,n) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13585
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13586
      val xs = List.tabulate (n,xIVar)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13587
      and ys = List.tabulate (n,yIVar)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13588
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13589
      fun cong ((i,yi),(th,lit)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13590
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13591
            val path = [i]
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13592
            val th = Metis_Thm.resolve lit th (Metis_Thm.equality lit path yi)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13593
            val lit = Metis_Literal.replace lit (path,yi)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13594
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13595
            (th,lit)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13596
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13597
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13598
      val assumeLit = (false,(R,xs))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13599
      val assumeTh = Metis_Thm.assume assumeLit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13600
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 13601
      fst (List.foldl cong (assumeTh,assumeLit) (enumerate ys))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13602
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13603
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13604
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13605
(*   ~(x = y) \/ C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13606
(* ----------------- symNeq ~(x = y)                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13607
(*   ~(y = x) \/ C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13608
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13609
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13610
fun symNeq lit th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13611
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13612
      val (x,y) = Metis_Literal.destNeq lit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13613
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13614
      if Metis_Term.equal x y then th
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13615
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13616
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13617
          val sub = Metis_Subst.fromList [(xVarName,y),(yVarName,x)]
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13618
          val symTh = Metis_Thm.subst sub symmetry
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13619
        in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13620
          Metis_Thm.resolve lit th symTh
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13621
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13622
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13623
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13624
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13625
(* sym (x = y) = symEq (x = y)  /\  sym ~(x = y) = symNeq ~(x = y)           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13626
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13627
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13628
fun sym (lit as (pol,_)) th = if pol then symEq lit th else symNeq lit th;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13629
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13630
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13631
(*   ~(x = x) \/ C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13632
(* ----------------- removeIrrefl                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13633
(*         C                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13634
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13635
(* where all irreflexive equalities.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13636
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13637
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13638
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13639
  fun irrefl ((true,_),th) = th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13640
    | irrefl (lit as (false,atm), th) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13641
      case total Metis_Atom.destRefl atm of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13642
        SOME x => Metis_Thm.resolve lit th (Metis_Thm.refl x)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13643
      | NONE => th;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13644
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13645
  fun removeIrrefl th = Metis_LiteralSet.foldl irrefl th (Metis_Thm.clause th);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13646
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13647
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13648
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13649
(*   x = y \/ y = x \/ C                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13650
(* ----------------------- removeSym                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13651
(*       x = y \/ C                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13652
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13653
(* where all duplicate copies of equalities and disequalities are removed.   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13654
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13655
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13656
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13657
  fun rem (lit as (pol,atm), eqs_th as (eqs,th)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13658
      case total Metis_Atom.sym atm of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13659
        NONE => eqs_th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13660
      | SOME atm' =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13661
        if Metis_LiteralSet.member lit eqs then
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13662
          (eqs, if pol then symEq lit th else symNeq lit th)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13663
        else
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13664
          (Metis_LiteralSet.add eqs (pol,atm'), th);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13665
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13666
  fun removeSym th =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13667
      snd (Metis_LiteralSet.foldl rem (Metis_LiteralSet.empty,th) (Metis_Thm.clause th));
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13668
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13669
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13670
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13671
(*   ~(v = t) \/ C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13672
(* ----------------- expandAbbrevs                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13673
(*      C[t/v]                                                               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13674
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13675
(* where t must not contain any occurrence of the variable v.                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13676
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13677
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13678
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13679
  fun expand lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13680
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13681
        val (x,y) = Metis_Literal.destNeq lit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13682
        val _ = Metis_Term.isTypedVar x orelse Metis_Term.isTypedVar y orelse
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13683
                raise Error "Metis_Rule.expandAbbrevs: no vars"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13684
        val _ = not (Metis_Term.equal x y) orelse
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13685
                raise Error "Metis_Rule.expandAbbrevs: equal vars"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13686
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13687
        Metis_Subst.unify Metis_Subst.empty x y
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13688
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13689
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13690
  fun expandAbbrevs th =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13691
      case Metis_LiteralSet.firstl (total expand) (Metis_Thm.clause th) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13692
        NONE => removeIrrefl th
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13693
      | SOME sub => expandAbbrevs (Metis_Thm.subst sub th);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13694
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13695
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13696
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13697
(* simplify = isTautology + expandAbbrevs + removeSym                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13698
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13699
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13700
fun simplify th =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13701
    if Metis_Thm.isTautology th then NONE
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13702
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13703
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13704
        val th' = th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13705
        val th' = expandAbbrevs th'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13706
        val th' = removeSym th'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13707
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13708
        if Metis_Thm.equal th th' then SOME th else simplify th'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13709
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13710
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13711
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13712
(*    C                                                                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13713
(* -------- freshVars                                                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13714
(*   C[s]                                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13715
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13716
(* where s is a renaming substitution chosen so that all of the variables in *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13717
(* C are replaced by fresh variables.                                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13718
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13719
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13720
fun freshVars th = Metis_Thm.subst (Metis_Subst.freshVars (Metis_Thm.freeVars th)) th;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13721
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13722
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13723
(*               C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13724
(* ---------------------------- factor                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13725
(*   C_s_1, C_s_2, ..., C_s_n                                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13726
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13727
(* where each s_i is a substitution that factors C, meaning that the theorem *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13728
(*                                                                           *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13729
(*   C_s_i = (removeIrrefl o removeSym o Metis_Thm.subst s_i) C                    *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13730
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13731
(* has fewer literals than C.                                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13732
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13733
(* Also, if s is any substitution that factors C, then one of the s_i will   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13734
(* result in a theorem C_s_i that strictly subsumes the theorem C_s.         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13735
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13736
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13737
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13738
  datatype edge =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13739
      FactorEdge of Metis_Atom.atom * Metis_Atom.atom
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13740
    | ReflEdge of Metis_Term.term * Metis_Term.term;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13741
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13742
  fun ppEdge (FactorEdge atm_atm') = Metis_Print.ppPair Metis_Atom.pp Metis_Atom.pp atm_atm'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13743
    | ppEdge (ReflEdge tm_tm') = Metis_Print.ppPair Metis_Term.pp Metis_Term.pp tm_tm';
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13744
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13745
  datatype joinStatus =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13746
      Joined
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13747
    | Joinable of Metis_Subst.subst
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13748
    | Apart;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13749
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13750
  fun joinEdge sub edge =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13751
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13752
        val result =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13753
            case edge of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13754
              FactorEdge (atm,atm') => total (Metis_Atom.unify sub atm) atm'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13755
            | ReflEdge (tm,tm') => total (Metis_Subst.unify sub tm) tm'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13756
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13757
        case result of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13758
          NONE => Apart
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13759
        | SOME sub' =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13760
          if Metis_Portable.pointerEqual (sub,sub') then Joined else Joinable sub'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13761
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13762
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13763
  fun updateApart sub =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13764
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13765
        fun update acc [] = SOME acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13766
          | update acc (edge :: edges) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13767
            case joinEdge sub edge of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13768
              Joined => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13769
            | Joinable _ => update (edge :: acc) edges
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13770
            | Apart => update acc edges
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13771
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13772
        update []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13773
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13774
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13775
  fun addFactorEdge (pol,atm) ((pol',atm'),acc) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13776
      if pol <> pol' then acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13777
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13778
        let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13779
          val edge = FactorEdge (atm,atm')
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13780
        in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13781
          case joinEdge Metis_Subst.empty edge of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13782
            Joined => raise Bug "addFactorEdge: joined"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13783
          | Joinable sub => (sub,edge) :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13784
          | Apart => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13785
        end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13786
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13787
  fun addReflEdge (false,_) acc = acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13788
    | addReflEdge (true,atm) acc =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13789
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13790
        val edge = ReflEdge (Metis_Atom.destEq atm)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13791
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13792
        case joinEdge Metis_Subst.empty edge of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13793
          Joined => raise Bug "addRefl: joined"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13794
        | Joinable _ => edge :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13795
        | Apart => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13796
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13797
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13798
  fun addIrreflEdge (true,_) acc = acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13799
    | addIrreflEdge (false,atm) acc =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13800
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13801
        val edge = ReflEdge (Metis_Atom.destEq atm)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13802
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13803
        case joinEdge Metis_Subst.empty edge of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13804
          Joined => raise Bug "addRefl: joined"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13805
        | Joinable sub => (sub,edge) :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13806
        | Apart => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13807
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13808
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13809
  fun init_edges acc _ [] =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13810
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13811
        fun init ((apart,sub,edge),(edges,acc)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13812
            (edge :: edges, (apart,sub,edges) :: acc)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13813
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13814
        snd (List.foldl init ([],[]) acc)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13815
      end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13816
    | init_edges acc apart ((sub,edge) :: sub_edges) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13817
      let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13818
(*MetisDebug
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13819
        val () = if not (Metis_Subst.null sub) then ()
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13820
                 else raise Bug "Metis_Rule.factor.init_edges: empty subst"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13821
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13822
        val (acc,apart) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13823
            case updateApart sub apart of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13824
              SOME apart' => ((apart',sub,edge) :: acc, edge :: apart)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13825
            | NONE => (acc,apart)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13826
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13827
        init_edges acc apart sub_edges
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13828
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13829
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13830
  fun mk_edges apart sub_edges [] = init_edges [] apart sub_edges
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13831
    | mk_edges apart sub_edges (lit :: lits) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13832
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13833
        val sub_edges = List.foldl (addFactorEdge lit) sub_edges lits
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13834
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13835
        val (apart,sub_edges) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13836
            case total Metis_Literal.sym lit of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13837
              NONE => (apart,sub_edges)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13838
            | SOME lit' =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13839
              let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13840
                val apart = addReflEdge lit apart
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13841
                val sub_edges = addIrreflEdge lit sub_edges
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13842
                val sub_edges = List.foldl (addFactorEdge lit') sub_edges lits
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13843
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13844
                (apart,sub_edges)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13845
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13846
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13847
        mk_edges apart sub_edges lits
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13848
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13849
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13850
  fun fact acc [] = acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13851
    | fact acc ((_,sub,[]) :: others) = fact (sub :: acc) others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13852
    | fact acc ((apart, sub, edge :: edges) :: others) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13853
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13854
        val others =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13855
            case joinEdge sub edge of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13856
              Joinable sub' =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13857
              let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13858
                val others = (edge :: apart, sub, edges) :: others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13859
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13860
                case updateApart sub' apart of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13861
                  NONE => others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13862
                | SOME apart' => (apart',sub',edges) :: others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13863
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13864
            | _ => (apart,sub,edges) :: others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13865
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13866
        fact acc others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13867
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13868
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13869
  fun factor' cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13870
      let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13871
(*MetisTrace6
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13872
        val () = Metis_Print.trace Metis_LiteralSet.pp "Metis_Rule.factor': cl" cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13873
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13874
        val edges = mk_edges [] [] (Metis_LiteralSet.toList cl)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13875
(*MetisTrace6
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13876
        val ppEdgesSize = Metis_Print.ppMap length Metis_Print.ppInt
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13877
        val ppEdgel = Metis_Print.ppList ppEdge
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13878
        val ppEdges = Metis_Print.ppList (Metis_Print.ppTriple ppEdgel Metis_Subst.pp ppEdgel)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13879
        val () = Metis_Print.trace ppEdgesSize "Metis_Rule.factor': |edges|" edges
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13880
        val () = Metis_Print.trace ppEdges "Metis_Rule.factor': edges" edges
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13881
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13882
        val result = fact [] edges
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13883
(*MetisTrace6
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13884
        val ppResult = Metis_Print.ppList Metis_Subst.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13885
        val () = Metis_Print.trace ppResult "Metis_Rule.factor': result" result
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13886
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13887
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13888
        result
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13889
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13890
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13891
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13892
fun factor th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13893
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13894
      fun fact sub = removeSym (Metis_Thm.subst sub th)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13895
    in
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 13896
      List.map fact (factor' (Metis_Thm.clause th))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13897
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13898
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13899
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13900
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 13901
(**** Original file: src/Normalize.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13902
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13903
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13904
(* NORMALIZING FORMULAS                                                      *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 13905
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13906
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13907
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13908
signature Metis_Normalize =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13909
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13910
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13911
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13912
(* Negation normal form.                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13913
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13914
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13915
val nnf : Metis_Formula.formula -> Metis_Formula.formula
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13916
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13917
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13918
(* Conjunctive normal form derivations.                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13919
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13920
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13921
type thm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13922
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13923
datatype inference =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13924
    Axiom of Metis_Formula.formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13925
  | Definition of string * Metis_Formula.formula
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13926
  | Simplify of thm * thm list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13927
  | Conjunct of thm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13928
  | Specialize of thm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13929
  | Skolemize of thm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13930
  | Clausify of thm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13931
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13932
val mkAxiom : Metis_Formula.formula -> thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13933
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13934
val destThm : thm -> Metis_Formula.formula * inference
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13935
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13936
val proveThms :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13937
    thm list -> (Metis_Formula.formula * inference * Metis_Formula.formula list) list
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13938
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13939
val toStringInference : inference -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13940
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13941
val ppInference : inference Metis_Print.pp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13942
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13943
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13944
(* Conjunctive normal form.                                                  *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13945
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13946
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13947
type cnf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13948
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13949
val initialCnf : cnf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13950
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13951
val addCnf : thm -> cnf -> (Metis_Thm.clause * thm) list * cnf
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13952
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13953
val proveCnf : thm list -> (Metis_Thm.clause * thm) list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13954
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13955
val cnf : Metis_Formula.formula -> Metis_Thm.clause list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13956
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13957
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13958
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 13959
(**** Original file: src/Normalize.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13960
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13961
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13962
(* NORMALIZING FORMULAS                                                      *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 13963
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13964
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13965
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13966
structure Metis_Normalize :> Metis_Normalize =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13967
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13968
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13969
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13970
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13971
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13972
(* Constants.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13973
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13974
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13975
val prefix = "FOFtoCNF";
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13976
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13977
val skolemPrefix = "skolem" ^ prefix;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13978
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13979
val definitionPrefix = "definition" ^ prefix;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13980
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13981
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13982
(* Storing huge real numbers as their log.                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13983
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13984
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13985
datatype logReal = LogReal of real;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13986
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13987
fun compareLogReal (LogReal logX, LogReal logY) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13988
    Real.compare (logX,logY);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13989
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13990
val zeroLogReal = LogReal ~1.0;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13991
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13992
val oneLogReal = LogReal 0.0;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13993
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13994
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13995
  fun isZero logX = logX < 0.0;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13996
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13997
  (* Assume logX >= logY >= 0.0 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13998
  fun add logX logY = logX + Math.ln (1.0 + Math.exp (logY - logX));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13999
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14000
  fun isZeroLogReal (LogReal logX) = isZero logX;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14001
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14002
  fun multiplyLogReal (LogReal logX) (LogReal logY) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14003
      if isZero logX orelse isZero logY then zeroLogReal
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14004
      else LogReal (logX + logY);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14005
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14006
  fun addLogReal (lx as LogReal logX) (ly as LogReal logY) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14007
      if isZero logX then ly
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14008
      else if isZero logY then lx
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14009
      else if logX < logY then LogReal (add logY logX)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14010
      else LogReal (add logX logY);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14011
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14012
  fun withinRelativeLogReal logDelta (LogReal logX) (LogReal logY) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14013
      isZero logX orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14014
      (not (isZero logY) andalso logX < logY + logDelta);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14015
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14016
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14017
fun toStringLogReal (LogReal logX) = Real.toString logX;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14018
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14019
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14020
(* Counting the clauses that would be generated by conjunctive normal form.  *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14021
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14022
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14023
val countLogDelta = 0.01;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14024
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14025
datatype count = Count of {positive : logReal, negative : logReal};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14026
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14027
fun countCompare (count1,count2) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14028
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14029
      val Count {positive = p1, negative = _} = count1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14030
      and Count {positive = p2, negative = _} = count2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14031
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14032
      compareLogReal (p1,p2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14033
    end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14034
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14035
fun countNegate (Count {positive = p, negative = n}) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14036
    Count {positive = n, negative = p};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14037
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14038
fun countLeqish count1 count2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14039
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14040
      val Count {positive = p1, negative = _} = count1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14041
      and Count {positive = p2, negative = _} = count2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14042
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14043
      withinRelativeLogReal countLogDelta p1 p2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14044
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14045
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14046
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14047
fun countEqualish count1 count2 =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14048
    countLeqish count1 count2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14049
    countLeqish count2 count1;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14050
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14051
fun countEquivish count1 count2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14052
    countEqualish count1 count2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14053
    countEqualish (countNegate count1) (countNegate count2);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14054
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14055
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14056
val countTrue = Count {positive = zeroLogReal, negative = oneLogReal};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14057
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14058
val countFalse = Count {positive = oneLogReal, negative = zeroLogReal};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14059
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14060
val countLiteral = Count {positive = oneLogReal, negative = oneLogReal};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14061
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14062
fun countAnd2 (count1,count2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14063
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14064
      val Count {positive = p1, negative = n1} = count1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14065
      and Count {positive = p2, negative = n2} = count2
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14066
      val p = addLogReal p1 p2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14067
      and n = multiplyLogReal n1 n2
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14068
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14069
      Count {positive = p, negative = n}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14070
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14071
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14072
fun countOr2 (count1,count2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14073
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14074
      val Count {positive = p1, negative = n1} = count1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14075
      and Count {positive = p2, negative = n2} = count2
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14076
      val p = multiplyLogReal p1 p2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14077
      and n = addLogReal n1 n2
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14078
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14079
      Count {positive = p, negative = n}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14080
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14081
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14082
(* Whether countXor2 is associative or not is an open question. *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14083
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14084
fun countXor2 (count1,count2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14085
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14086
      val Count {positive = p1, negative = n1} = count1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14087
      and Count {positive = p2, negative = n2} = count2
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14088
      val p = addLogReal (multiplyLogReal p1 p2) (multiplyLogReal n1 n2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14089
      and n = addLogReal (multiplyLogReal p1 n2) (multiplyLogReal n1 p2)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14090
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14091
      Count {positive = p, negative = n}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14092
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14093
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14094
fun countDefinition body_count = countXor2 (countLiteral,body_count);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14095
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14096
val countToString =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14097
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14098
      val rToS = toStringLogReal
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14099
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14100
      fn Count {positive = p, negative = n} =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14101
         "(+" ^ rToS p ^ ",-" ^ rToS n ^ ")"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14102
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14103
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14104
val ppCount = Metis_Print.ppMap countToString Metis_Print.ppString;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14105
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14106
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14107
(* A type of normalized formula.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14108
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14109
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14110
datatype formula =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14111
    True
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14112
  | False
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14113
  | Metis_Literal of Metis_NameSet.set * Metis_Literal.literal
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14114
  | And of Metis_NameSet.set * count * formula Metis_Set.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14115
  | Or of Metis_NameSet.set * count * formula Metis_Set.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14116
  | Xor of Metis_NameSet.set * count * bool * formula Metis_Set.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14117
  | Exists of Metis_NameSet.set * count * Metis_NameSet.set * formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14118
  | Forall of Metis_NameSet.set * count * Metis_NameSet.set * formula;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14119
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14120
fun compare f1_f2 =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14121
    if Metis_Portable.pointerEqual f1_f2 then EQUAL
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14122
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14123
      case f1_f2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14124
        (True,True) => EQUAL
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14125
      | (True,_) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14126
      | (_,True) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14127
      | (False,False) => EQUAL
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14128
      | (False,_) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14129
      | (_,False) => GREATER
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14130
      | (Metis_Literal (_,l1), Metis_Literal (_,l2)) => Metis_Literal.compare (l1,l2)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14131
      | (Metis_Literal _, _) => LESS
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14132
      | (_, Metis_Literal _) => GREATER
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14133
      | (And (_,_,s1), And (_,_,s2)) => Metis_Set.compare (s1,s2)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14134
      | (And _, _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14135
      | (_, And _) => GREATER
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14136
      | (Or (_,_,s1), Or (_,_,s2)) => Metis_Set.compare (s1,s2)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14137
      | (Or _, _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14138
      | (_, Or _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14139
      | (Xor (_,_,p1,s1), Xor (_,_,p2,s2)) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14140
        (case boolCompare (p1,p2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14141
           LESS => LESS
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14142
         | EQUAL => Metis_Set.compare (s1,s2)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14143
         | GREATER => GREATER)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14144
      | (Xor _, _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14145
      | (_, Xor _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14146
      | (Exists (_,_,n1,f1), Exists (_,_,n2,f2)) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14147
        (case Metis_NameSet.compare (n1,n2) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14148
           LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14149
         | EQUAL => compare (f1,f2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14150
         | GREATER => GREATER)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14151
      | (Exists _, _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14152
      | (_, Exists _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14153
      | (Forall (_,_,n1,f1), Forall (_,_,n2,f2)) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14154
        (case Metis_NameSet.compare (n1,n2) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14155
           LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14156
         | EQUAL => compare (f1,f2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14157
         | GREATER => GREATER);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14158
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14159
val empty = Metis_Set.empty compare;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14160
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14161
val singleton = Metis_Set.singleton compare;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14162
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14163
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14164
  fun neg True = False
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14165
    | neg False = True
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14166
    | neg (Metis_Literal (fv,lit)) = Metis_Literal (fv, Metis_Literal.negate lit)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14167
    | neg (And (fv,c,s)) = Or (fv, countNegate c, neg_set s)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14168
    | neg (Or (fv,c,s)) = And (fv, countNegate c, neg_set s)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14169
    | neg (Xor (fv,c,p,s)) = Xor (fv, c, not p, s)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14170
    | neg (Exists (fv,c,n,f)) = Forall (fv, countNegate c, n, neg f)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14171
    | neg (Forall (fv,c,n,f)) = Exists (fv, countNegate c, n, neg f)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14172
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14173
  and neg_set s = Metis_Set.foldl neg_elt empty s
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14174
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14175
  and neg_elt (f,s) = Metis_Set.add s (neg f);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14176
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14177
  val negate = neg;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14178
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14179
  val negateSet = neg_set;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14180
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14181
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14182
fun negateMember x s = Metis_Set.member (negate x) s;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14183
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14184
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14185
  fun member s x = negateMember x s;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14186
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14187
  fun negateDisjoint s1 s2 =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14188
      if Metis_Set.size s1 < Metis_Set.size s2 then not (Metis_Set.exists (member s2) s1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14189
      else not (Metis_Set.exists (member s1) s2);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14190
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14191
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14192
fun polarity True = true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14193
  | polarity False = false
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14194
  | polarity (Metis_Literal (_,(pol,_))) = not pol
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14195
  | polarity (And _) = true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14196
  | polarity (Or _) = false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14197
  | polarity (Xor (_,_,pol,_)) = pol
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14198
  | polarity (Exists _) = true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14199
  | polarity (Forall _) = false;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14200
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14201
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14202
val polarity = fn f =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14203
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14204
      val res1 = compare (f, negate f) = LESS
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14205
      val res2 = polarity f
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14206
      val _ = res1 = res2 orelse raise Bug "polarity"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14207
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14208
      res2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14209
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14210
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14211
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14212
fun applyPolarity true fm = fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14213
  | applyPolarity false fm = negate fm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14214
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14215
fun freeVars True = Metis_NameSet.empty
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14216
  | freeVars False = Metis_NameSet.empty
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14217
  | freeVars (Metis_Literal (fv,_)) = fv
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14218
  | freeVars (And (fv,_,_)) = fv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14219
  | freeVars (Or (fv,_,_)) = fv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14220
  | freeVars (Xor (fv,_,_,_)) = fv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14221
  | freeVars (Exists (fv,_,_,_)) = fv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14222
  | freeVars (Forall (fv,_,_,_)) = fv;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14223
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14224
fun freeIn v fm = Metis_NameSet.member v (freeVars fm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14225
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14226
val freeVarsSet =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14227
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14228
      fun free (fm,acc) = Metis_NameSet.union (freeVars fm) acc
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14229
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14230
      Metis_Set.foldl free Metis_NameSet.empty
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14231
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14232
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14233
fun count True = countTrue
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14234
  | count False = countFalse
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14235
  | count (Metis_Literal _) = countLiteral
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14236
  | count (And (_,c,_)) = c
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14237
  | count (Or (_,c,_)) = c
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14238
  | count (Xor (_,c,p,_)) = if p then c else countNegate c
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14239
  | count (Exists (_,c,_,_)) = c
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14240
  | count (Forall (_,c,_,_)) = c;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14241
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14242
val countAndSet =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14243
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14244
      fun countAnd (fm,c) = countAnd2 (count fm, c)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14245
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14246
      Metis_Set.foldl countAnd countTrue
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14247
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14248
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14249
val countOrSet =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14250
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14251
      fun countOr (fm,c) = countOr2 (count fm, c)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14252
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14253
      Metis_Set.foldl countOr countFalse
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14254
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14255
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14256
val countXorSet =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14257
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14258
      fun countXor (fm,c) = countXor2 (count fm, c)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14259
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14260
      Metis_Set.foldl countXor countFalse
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14261
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14262
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14263
fun And2 (False,_) = False
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14264
  | And2 (_,False) = False
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14265
  | And2 (True,f2) = f2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14266
  | And2 (f1,True) = f1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14267
  | And2 (f1,f2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14268
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14269
      val (fv1,c1,s1) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14270
          case f1 of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14271
            And fv_c_s => fv_c_s
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14272
          | _ => (freeVars f1, count f1, singleton f1)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14273
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14274
      and (fv2,c2,s2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14275
          case f2 of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14276
            And fv_c_s => fv_c_s
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14277
          | _ => (freeVars f2, count f2, singleton f2)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14278
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14279
      if not (negateDisjoint s1 s2) then False
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14280
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14281
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14282
          val s = Metis_Set.union s1 s2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14283
        in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14284
          case Metis_Set.size s of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14285
            0 => True
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14286
          | 1 => Metis_Set.pick s
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14287
          | n =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14288
            if n = Metis_Set.size s1 + Metis_Set.size s2 then
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14289
              And (Metis_NameSet.union fv1 fv2, countAnd2 (c1,c2), s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14290
            else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14291
              And (freeVarsSet s, countAndSet s, s)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14292
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14293
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14294
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14295
val AndList = List.foldl And2 True;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14296
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14297
val AndSet = Metis_Set.foldl And2 True;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14298
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14299
fun Or2 (True,_) = True
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14300
  | Or2 (_,True) = True
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14301
  | Or2 (False,f2) = f2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14302
  | Or2 (f1,False) = f1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14303
  | Or2 (f1,f2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14304
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14305
      val (fv1,c1,s1) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14306
          case f1 of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14307
            Or fv_c_s => fv_c_s
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14308
          | _ => (freeVars f1, count f1, singleton f1)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14309
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14310
      and (fv2,c2,s2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14311
          case f2 of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14312
            Or fv_c_s => fv_c_s
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14313
          | _ => (freeVars f2, count f2, singleton f2)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14314
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14315
      if not (negateDisjoint s1 s2) then True
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14316
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14317
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14318
          val s = Metis_Set.union s1 s2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14319
        in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14320
          case Metis_Set.size s of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14321
            0 => False
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14322
          | 1 => Metis_Set.pick s
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14323
          | n =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14324
            if n = Metis_Set.size s1 + Metis_Set.size s2 then
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14325
              Or (Metis_NameSet.union fv1 fv2, countOr2 (c1,c2), s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14326
            else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14327
              Or (freeVarsSet s, countOrSet s, s)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14328
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14329
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14330
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14331
val OrList = List.foldl Or2 False;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14332
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14333
val OrSet = Metis_Set.foldl Or2 False;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14334
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14335
fun pushOr2 (f1,f2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14336
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14337
      val s1 = case f1 of And (_,_,s) => s | _ => singleton f1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14338
      and s2 = case f2 of And (_,_,s) => s | _ => singleton f2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14339
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14340
      fun g x1 (x2,acc) = And2 (Or2 (x1,x2), acc)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14341
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14342
      fun f (x1,acc) = Metis_Set.foldl (g x1) acc s2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14343
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14344
      Metis_Set.foldl f True s1
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14345
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14346
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14347
val pushOrList = List.foldl pushOr2 False;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14348
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14349
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14350
  fun normalize fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14351
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14352
        val p = polarity fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14353
        val fm = applyPolarity p fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14354
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14355
        (freeVars fm, count fm, p, singleton fm)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14356
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14357
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14358
  fun Xor2 (False,f2) = f2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14359
    | Xor2 (f1,False) = f1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14360
    | Xor2 (True,f2) = negate f2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14361
    | Xor2 (f1,True) = negate f1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14362
    | Xor2 (f1,f2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14363
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14364
        val (fv1,c1,p1,s1) = case f1 of Xor x => x | _ => normalize f1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14365
        and (fv2,c2,p2,s2) = case f2 of Xor x => x | _ => normalize f2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14366
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14367
        val s = Metis_Set.symmetricDifference s1 s2
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14368
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14369
        val fm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14370
            case Metis_Set.size s of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14371
              0 => False
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14372
            | 1 => Metis_Set.pick s
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14373
            | n =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14374
              if n = Metis_Set.size s1 + Metis_Set.size s2 then
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14375
                Xor (Metis_NameSet.union fv1 fv2, countXor2 (c1,c2), true, s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14376
              else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14377
                Xor (freeVarsSet s, countXorSet s, true, s)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14378
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14379
        val p = p1 = p2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14380
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14381
        applyPolarity p fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14382
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14383
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14384
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14385
val XorList = List.foldl Xor2 False;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14386
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14387
val XorSet = Metis_Set.foldl Xor2 False;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14388
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14389
fun XorPolarityList (p,l) = applyPolarity p (XorList l);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14390
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14391
fun XorPolaritySet (p,s) = applyPolarity p (XorSet s);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14392
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14393
fun destXor (Xor (_,_,p,s)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14394
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14395
      val (fm1,s) = Metis_Set.deletePick s
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14396
      val fm2 =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14397
          if Metis_Set.size s = 1 then applyPolarity p (Metis_Set.pick s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14398
          else Xor (freeVarsSet s, countXorSet s, p, s)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14399
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14400
      (fm1,fm2)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14401
    end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14402
  | destXor _ = raise Error "destXor";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14403
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14404
fun pushXor fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14405
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14406
      val (f1,f2) = destXor fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14407
      val f1' = negate f1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14408
      and f2' = negate f2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14409
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14410
      And2 (Or2 (f1,f2), Or2 (f1',f2'))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14411
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14412
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14413
fun Exists1 (v,init_fm) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14414
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14415
      fun exists_gen fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14416
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14417
            val fv = Metis_NameSet.delete (freeVars fm) v
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14418
            val c = count fm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14419
            val n = Metis_NameSet.singleton v
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14420
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14421
            Exists (fv,c,n,fm)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14422
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14423
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14424
      fun exists fm = if freeIn v fm then exists_free fm else fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14425
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14426
      and exists_free (Or (_,_,s)) = OrList (Metis_Set.transform exists s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14427
        | exists_free (fm as And (_,_,s)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14428
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14429
            val sv = Metis_Set.filter (freeIn v) s
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14430
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14431
            if Metis_Set.size sv <> 1 then exists_gen fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14432
            else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14433
              let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14434
                val fm = Metis_Set.pick sv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14435
                val s = Metis_Set.delete s fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14436
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14437
                And2 (exists_free fm, AndSet s)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14438
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14439
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14440
        | exists_free (Exists (fv,c,n,f)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14441
          Exists (Metis_NameSet.delete fv v, c, Metis_NameSet.add n v, f)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14442
        | exists_free fm = exists_gen fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14443
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14444
      exists init_fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14445
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14446
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14447
fun ExistsList (vs,f) = List.foldl Exists1 f vs;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14448
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14449
fun ExistsSet (n,f) = Metis_NameSet.foldl Exists1 f n;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14450
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14451
fun Forall1 (v,init_fm) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14452
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14453
      fun forall_gen fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14454
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14455
            val fv = Metis_NameSet.delete (freeVars fm) v
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14456
            val c = count fm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14457
            val n = Metis_NameSet.singleton v
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14458
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14459
            Forall (fv,c,n,fm)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14460
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14461
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14462
      fun forall fm = if freeIn v fm then forall_free fm else fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14463
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14464
      and forall_free (And (_,_,s)) = AndList (Metis_Set.transform forall s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14465
        | forall_free (fm as Or (_,_,s)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14466
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14467
            val sv = Metis_Set.filter (freeIn v) s
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14468
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14469
            if Metis_Set.size sv <> 1 then forall_gen fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14470
            else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14471
              let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14472
                val fm = Metis_Set.pick sv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14473
                val s = Metis_Set.delete s fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14474
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14475
                Or2 (forall_free fm, OrSet s)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14476
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14477
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14478
        | forall_free (Forall (fv,c,n,f)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14479
          Forall (Metis_NameSet.delete fv v, c, Metis_NameSet.add n v, f)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14480
        | forall_free fm = forall_gen fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14481
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14482
      forall init_fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14483
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14484
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14485
fun ForallList (vs,f) = List.foldl Forall1 f vs;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14486
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14487
fun ForallSet (n,f) = Metis_NameSet.foldl Forall1 f n;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14488
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14489
fun generalize f = ForallSet (freeVars f, f);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14490
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14491
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14492
  fun subst_fv fvSub =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14493
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14494
        fun add_fv (v,s) = Metis_NameSet.union (Metis_NameMap.get fvSub v) s
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14495
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14496
        Metis_NameSet.foldl add_fv Metis_NameSet.empty
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14497
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14498
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14499
  fun subst_rename (v,(avoid,bv,sub,domain,fvSub)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14500
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14501
        val v' = Metis_Term.variantPrime avoid v
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14502
        val avoid = Metis_NameSet.add avoid v'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14503
        val bv = Metis_NameSet.add bv v'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14504
        val sub = Metis_Subst.insert sub (v, Metis_Term.Var v')
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14505
        val domain = Metis_NameSet.add domain v
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14506
        val fvSub = Metis_NameMap.insert fvSub (v, Metis_NameSet.singleton v')
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14507
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14508
        (avoid,bv,sub,domain,fvSub)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14509
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14510
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14511
  fun subst_check sub domain fvSub fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14512
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14513
        val domain = Metis_NameSet.intersect domain (freeVars fm)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14514
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14515
        if Metis_NameSet.null domain then fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14516
        else subst_domain sub domain fvSub fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14517
      end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14518
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14519
  and subst_domain sub domain fvSub fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14520
      case fm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14521
        Metis_Literal (fv,lit) =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14522
        let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14523
          val fv = Metis_NameSet.difference fv domain
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14524
          val fv = Metis_NameSet.union fv (subst_fv fvSub domain)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14525
          val lit = Metis_Literal.subst sub lit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14526
        in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14527
          Metis_Literal (fv,lit)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14528
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14529
      | And (_,_,s) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14530
        AndList (Metis_Set.transform (subst_check sub domain fvSub) s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14531
      | Or (_,_,s) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14532
        OrList (Metis_Set.transform (subst_check sub domain fvSub) s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14533
      | Xor (_,_,p,s) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14534
        XorPolarityList (p, Metis_Set.transform (subst_check sub domain fvSub) s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14535
      | Exists fv_c_n_f => subst_quant Exists sub domain fvSub fv_c_n_f
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14536
      | Forall fv_c_n_f => subst_quant Forall sub domain fvSub fv_c_n_f
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14537
      | _ => raise Bug "subst_domain"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14538
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14539
  and subst_quant quant sub domain fvSub (fv,c,bv,fm) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14540
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14541
        val sub_fv = subst_fv fvSub domain
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14542
        val fv = Metis_NameSet.union sub_fv (Metis_NameSet.difference fv domain)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14543
        val captured = Metis_NameSet.intersect bv sub_fv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14544
        val bv = Metis_NameSet.difference bv captured
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14545
        val avoid = Metis_NameSet.union fv bv
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14546
        val (_,bv,sub,domain,fvSub) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14547
            Metis_NameSet.foldl subst_rename (avoid,bv,sub,domain,fvSub) captured
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14548
        val fm = subst_domain sub domain fvSub fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14549
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14550
        quant (fv,c,bv,fm)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14551
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14552
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14553
  fun subst sub =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14554
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14555
        fun mk_dom (v,tm,(d,fv)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14556
            (Metis_NameSet.add d v, Metis_NameMap.insert fv (v, Metis_Term.freeVars tm))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14557
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14558
        val domain_fvSub = (Metis_NameSet.empty, Metis_NameMap.new ())
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14559
        val (domain,fvSub) = Metis_Subst.foldl mk_dom domain_fvSub sub
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14560
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14561
        subst_check sub domain fvSub
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14562
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14563
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14564
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14565
fun fromFormula fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14566
    case fm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14567
      Metis_Formula.True => True
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14568
    | Metis_Formula.False => False
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14569
    | Metis_Formula.Metis_Atom atm => Metis_Literal (Metis_Atom.freeVars atm, (true,atm))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14570
    | Metis_Formula.Not p => negateFromFormula p
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14571
    | Metis_Formula.And (p,q) => And2 (fromFormula p, fromFormula q)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14572
    | Metis_Formula.Or (p,q) => Or2 (fromFormula p, fromFormula q)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14573
    | Metis_Formula.Imp (p,q) => Or2 (negateFromFormula p, fromFormula q)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14574
    | Metis_Formula.Iff (p,q) => Xor2 (negateFromFormula p, fromFormula q)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14575
    | Metis_Formula.Forall (v,p) => Forall1 (v, fromFormula p)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14576
    | Metis_Formula.Exists (v,p) => Exists1 (v, fromFormula p)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14577
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14578
and negateFromFormula fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14579
    case fm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14580
      Metis_Formula.True => False
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14581
    | Metis_Formula.False => True
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14582
    | Metis_Formula.Metis_Atom atm => Metis_Literal (Metis_Atom.freeVars atm, (false,atm))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14583
    | Metis_Formula.Not p => fromFormula p
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14584
    | Metis_Formula.And (p,q) => Or2 (negateFromFormula p, negateFromFormula q)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14585
    | Metis_Formula.Or (p,q) => And2 (negateFromFormula p, negateFromFormula q)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14586
    | Metis_Formula.Imp (p,q) => And2 (fromFormula p, negateFromFormula q)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14587
    | Metis_Formula.Iff (p,q) => Xor2 (fromFormula p, fromFormula q)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14588
    | Metis_Formula.Forall (v,p) => Exists1 (v, negateFromFormula p)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14589
    | Metis_Formula.Exists (v,p) => Forall1 (v, negateFromFormula p);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14590
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14591
local
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14592
  fun lastElt (s : formula Metis_Set.set) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14593
      case Metis_Set.findr (K true) s of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14594
        NONE => raise Bug "lastElt: empty set"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14595
      | SOME fm => fm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14596
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14597
  fun negateLastElt s =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14598
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14599
        val fm = lastElt s
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14600
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14601
        Metis_Set.add (Metis_Set.delete s fm) (negate fm)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14602
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14603
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14604
  fun form fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14605
      case fm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14606
        True => Metis_Formula.True
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14607
      | False => Metis_Formula.False
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14608
      | Metis_Literal (_,lit) => Metis_Literal.toFormula lit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14609
      | And (_,_,s) => Metis_Formula.listMkConj (Metis_Set.transform form s)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14610
      | Or (_,_,s) => Metis_Formula.listMkDisj (Metis_Set.transform form s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14611
      | Xor (_,_,p,s) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14612
        let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14613
          val s = if p then negateLastElt s else s
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14614
        in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14615
          Metis_Formula.listMkEquiv (Metis_Set.transform form s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14616
        end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14617
      | Exists (_,_,n,f) => Metis_Formula.listMkExists (Metis_NameSet.toList n, form f)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14618
      | Forall (_,_,n,f) => Metis_Formula.listMkForall (Metis_NameSet.toList n, form f);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14619
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14620
  val toFormula = form;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14621
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14622
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14623
fun toLiteral (Metis_Literal (_,lit)) = lit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14624
  | toLiteral _ = raise Error "Metis_Normalize.toLiteral";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14625
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14626
local
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14627
  fun addLiteral (l,s) = Metis_LiteralSet.add s (toLiteral l);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14628
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14629
  fun toClause False = Metis_LiteralSet.empty
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14630
    | toClause (Or (_,_,s)) = Metis_Set.foldl addLiteral Metis_LiteralSet.empty s
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14631
    | toClause l = Metis_LiteralSet.singleton (toLiteral l);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14632
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14633
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14634
val pp = Metis_Print.ppMap toFormula Metis_Formula.pp;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14635
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14636
val toString = Metis_Print.toString pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14637
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14638
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14639
(* Negation normal form.                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14640
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14641
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14642
fun nnf fm = toFormula (fromFormula fm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14643
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14644
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14645
(* Basic conjunctive normal form.                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14646
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14647
39503
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 14648
local
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 14649
  val counter : int Metis_StringMap.map Unsynchronized.ref = Unsynchronized.ref (Metis_StringMap.new ());
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 14650
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 14651
  fun new n () =
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 14652
      let
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 14653
        val Unsynchronized.ref m = counter
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 14654
        val s = Metis_Name.toString n
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 14655
        val i = Option.getOpt (Metis_StringMap.peek m s, 0)
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 14656
        val () = counter := Metis_StringMap.insert m (s, i + 1)
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 14657
        val i = if i = 0 then "" else "_" ^ Int.toString i
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 14658
        val s = skolemPrefix ^ "_" ^ s ^ i
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 14659
      in
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 14660
        Metis_Name.fromString s
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 14661
      end;
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 14662
in
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 14663
  fun newSkolemFunction n = Metis_Portable.critical (new n) ();
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 14664
end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14665
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14666
fun skolemize fv bv fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14667
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14668
      val fv = Metis_NameSet.transform Metis_Term.Var fv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14669
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14670
      fun mk (v,s) = Metis_Subst.insert s (v, Metis_Term.Fn (newSkolemFunction v, fv))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14671
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14672
      subst (Metis_NameSet.foldl mk Metis_Subst.empty bv) fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14673
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14674
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14675
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14676
  fun rename avoid fv bv fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14677
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14678
        val captured = Metis_NameSet.intersect avoid bv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14679
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14680
        if Metis_NameSet.null captured then fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14681
        else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14682
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14683
            fun ren (v,(a,s)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14684
                let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14685
                  val v' = Metis_Term.variantPrime a v
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14686
                in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14687
                  (Metis_NameSet.add a v', Metis_Subst.insert s (v, Metis_Term.Var v'))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14688
                end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14689
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14690
            val avoid = Metis_NameSet.union (Metis_NameSet.union avoid fv) bv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14691
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14692
            val (_,sub) = Metis_NameSet.foldl ren (avoid,Metis_Subst.empty) captured
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14693
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14694
            subst sub fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14695
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14696
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14697
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14698
  fun cnfFm avoid fm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14699
(*MetisTrace5
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14700
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14701
        val fm' = cnfFm' avoid fm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14702
        val () = Metis_Print.trace pp "Metis_Normalize.cnfFm: fm" fm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14703
        val () = Metis_Print.trace pp "Metis_Normalize.cnfFm: fm'" fm'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14704
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14705
        fm'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14706
      end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14707
  and cnfFm' avoid fm =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14708
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14709
      case fm of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14710
        True => True
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14711
      | False => False
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14712
      | Metis_Literal _ => fm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14713
      | And (_,_,s) => AndList (Metis_Set.transform (cnfFm avoid) s)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14714
      | Or (fv,_,s) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14715
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14716
          val avoid = Metis_NameSet.union avoid fv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14717
          val (fms,_) = Metis_Set.foldl cnfOr ([],avoid) s
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14718
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14719
          pushOrList fms
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14720
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14721
      | Xor _ => cnfFm avoid (pushXor fm)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14722
      | Exists (fv,_,n,f) => cnfFm avoid (skolemize fv n f)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14723
      | Forall (fv,_,n,f) => cnfFm avoid (rename avoid fv n f)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14724
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14725
  and cnfOr (fm,(fms,avoid)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14726
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14727
        val fm = cnfFm avoid fm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14728
        val fms = fm :: fms
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14729
        val avoid = Metis_NameSet.union avoid (freeVars fm)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14730
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14731
        (fms,avoid)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14732
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14733
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14734
  val basicCnf = cnfFm Metis_NameSet.empty;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14735
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14736
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14737
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14738
(* Finding the formula definition that minimizes the number of clauses.      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14739
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14740
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14741
local
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14742
  type best = count * formula option;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14743
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14744
  fun minBreak countClauses fm best =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14745
      case fm of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14746
        True => best
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14747
      | False => best
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14748
      | Metis_Literal _ => best
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14749
      | And (_,_,s) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14750
        minBreakSet countClauses countAnd2 countTrue AndSet s best
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14751
      | Or (_,_,s) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14752
        minBreakSet countClauses countOr2 countFalse OrSet s best
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14753
      | Xor (_,_,_,s) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14754
        minBreakSet countClauses countXor2 countFalse XorSet s best
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14755
      | Exists (_,_,_,f) => minBreak countClauses f best
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14756
      | Forall (_,_,_,f) => minBreak countClauses f best
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14757
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14758
  and minBreakSet countClauses count2 count0 mkSet fmSet best =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14759
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14760
        fun cumulatives fms =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14761
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14762
              fun fwd (fm,(c1,s1,l)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14763
                  let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14764
                    val c1' = count2 (count fm, c1)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14765
                    and s1' = Metis_Set.add s1 fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14766
                  in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14767
                    (c1', s1', (c1,s1,fm) :: l)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14768
                  end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14769
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14770
              fun bwd ((c1,s1,fm),(c2,s2,l)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14771
                  let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14772
                    val c2' = count2 (count fm, c2)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14773
                    and s2' = Metis_Set.add s2 fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14774
                  in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14775
                    (c2', s2', (c1,s1,fm,c2,s2) :: l)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14776
                  end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14777
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 14778
              val (c1,_,fms) = List.foldl fwd (count0,empty,[]) fms
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 14779
              val (c2,_,fms) = List.foldl bwd (count0,empty,[]) fms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14780
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14781
(*MetisDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14782
              val _ = countEquivish c1 c2 orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14783
                      raise Bug ("cumulativeCounts: c1 = " ^ countToString c1 ^
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14784
                                 ", c2 = " ^ countToString c2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14785
*)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14786
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14787
              fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14788
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14789
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14790
        fun breakSing ((c1,_,fm,c2,_),best) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14791
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14792
              val cFms = count2 (c1,c2)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14793
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14794
              fun countCls cFm = countClauses (count2 (cFms,cFm))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14795
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14796
              minBreak countCls fm best
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14797
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14798
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14799
        val breakSet1 =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14800
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14801
              fun break c1 s1 fm c2 (best as (bcl,_)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14802
                  if Metis_Set.null s1 then best
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14803
                  else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14804
                    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14805
                      val cDef = countDefinition (countXor2 (c1, count fm))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14806
                      val cFm = count2 (countLiteral,c2)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14807
                      val cl = countAnd2 (cDef, countClauses cFm)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14808
                      val noBetter = countLeqish bcl cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14809
                    in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14810
                      if noBetter then best
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14811
                      else (cl, SOME (mkSet (Metis_Set.add s1 fm)))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14812
                    end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14813
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14814
              fn ((c1,s1,fm,c2,s2),best) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14815
                 break c1 s1 fm c2 (break c2 s2 fm c1 best)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14816
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14817
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14818
        val fms = Metis_Set.toList fmSet
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14819
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14820
        fun breakSet measure best =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14821
            let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14822
              val fms = sortMap (measure o count) countCompare fms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14823
            in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 14824
              List.foldl breakSet1 best (cumulatives fms)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 14825
            end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 14826
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 14827
        val best = List.foldl breakSing best (cumulatives fms)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14828
        val best = breakSet I best
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14829
        val best = breakSet countNegate best
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14830
        val best = breakSet countClauses best
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14831
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14832
        best
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14833
      end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14834
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14835
  fun minimumDefinition fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14836
      let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14837
        val cl = count fm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14838
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14839
        if countLeqish cl countLiteral then NONE
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14840
        else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14841
          let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14842
            val (cl',def) = minBreak I fm (cl,NONE)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14843
(*MetisTrace1
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14844
            val () =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14845
                case def of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14846
                  NONE => ()
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14847
                | SOME d =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14848
                  Metis_Print.trace pp ("defCNF: before = " ^ countToString cl ^
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14849
                                  ", after = " ^ countToString cl' ^
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14850
                                  ", definition") d
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14851
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14852
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14853
            def
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14854
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14855
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14856
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14857
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14858
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14859
(* Conjunctive normal form derivations.                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14860
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14861
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14862
datatype thm = Metis_Thm of formula * inference
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14863
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14864
and inference =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14865
    Axiom of Metis_Formula.formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14866
  | Definition of string * Metis_Formula.formula
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14867
  | Simplify of thm * thm list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14868
  | Conjunct of thm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14869
  | Specialize of thm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14870
  | Skolemize of thm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14871
  | Clausify of thm;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14872
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14873
fun parentsInference inf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14874
    case inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14875
      Axiom _ => []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14876
    | Definition _ => []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14877
    | Simplify (th,ths) => th :: ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14878
    | Conjunct th => [th]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14879
    | Specialize th => [th]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14880
    | Skolemize th => [th]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14881
    | Clausify th => [th];
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14882
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14883
fun compareThm (Metis_Thm (fm1,_), Metis_Thm (fm2,_)) = compare (fm1,fm2);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14884
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14885
fun parentsThm (Metis_Thm (_,inf)) = parentsInference inf;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14886
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14887
fun mkAxiom fm = Metis_Thm (fromFormula fm, Axiom fm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14888
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14889
fun destThm (Metis_Thm (fm,inf)) = (toFormula fm, inf);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14890
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14891
local
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14892
  val emptyProved : (thm,Metis_Formula.formula) Metis_Map.map = Metis_Map.new compareThm;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14893
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14894
  fun isProved proved th = Metis_Map.inDomain th proved;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14895
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14896
  fun isUnproved proved th = not (isProved proved th);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14897
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14898
  fun lookupProved proved th =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14899
      case Metis_Map.peek proved th of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14900
        SOME fm => fm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14901
      | NONE => raise Bug "Metis_Normalize.lookupProved";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14902
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14903
  fun prove acc proved ths =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14904
      case ths of
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 14905
        [] => List.rev acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14906
      | th :: ths' =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14907
        if isProved proved th then prove acc proved ths'
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14908
        else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14909
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14910
            val pars = parentsThm th
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14911
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14912
            val deps = List.filter (isUnproved proved) pars
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14913
          in
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 14914
            if List.null deps then
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14915
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14916
                val (fm,inf) = destThm th
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14917
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 14918
                val fms = List.map (lookupProved proved) pars
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14919
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14920
                val acc = (fm,inf,fms) :: acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14921
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14922
                val proved = Metis_Map.insert proved (th,fm)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14923
              in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14924
                prove acc proved ths'
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14925
              end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14926
            else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14927
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14928
                val ths = deps @ ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14929
              in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14930
                prove acc proved ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14931
              end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14932
          end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14933
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14934
  val proveThms = prove [] emptyProved;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14935
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14936
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14937
fun toStringInference inf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14938
    case inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14939
      Axiom _ => "Axiom"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14940
    | Definition _ => "Definition"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14941
    | Simplify _ => "Simplify"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14942
    | Conjunct _ => "Conjunct"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14943
    | Specialize _ => "Specialize"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14944
    | Skolemize _ => "Skolemize"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14945
    | Clausify _ => "Clausify";
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14946
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14947
val ppInference = Metis_Print.ppMap toStringInference Metis_Print.ppString;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14948
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14949
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14950
(* Simplifying with definitions.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14951
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14952
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14953
datatype simplify =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14954
    Simp of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14955
      {formula : (formula, formula * thm) Metis_Map.map,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14956
       andSet : (formula Metis_Set.set * formula * thm) list,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14957
       orSet : (formula Metis_Set.set * formula * thm) list,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14958
       xorSet : (formula Metis_Set.set * formula * thm) list};
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14959
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14960
val simplifyEmpty =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14961
    Simp
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14962
      {formula = Metis_Map.new compare,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14963
       andSet = [],
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14964
       orSet = [],
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14965
       xorSet = []};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14966
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14967
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14968
  fun simpler fm s =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14969
      Metis_Set.size s <> 1 orelse
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14970
      case Metis_Set.pick s of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14971
        True => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14972
      | False => false
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14973
      | Metis_Literal _ => false
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14974
      | _ => true;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14975
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14976
  fun addSet set_defs body_def =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14977
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14978
        fun def_body_size (body,_,_) = Metis_Set.size body
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14979
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14980
        val body_size = def_body_size body_def
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14981
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14982
        val (body,_,_) = body_def
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14983
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14984
        fun add acc [] = List.revAppend (acc,[body_def])
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14985
          | add acc (l as (bd as (b,_,_)) :: bds) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14986
            case Int.compare (def_body_size bd, body_size) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14987
              LESS => List.revAppend (acc, body_def :: l)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14988
            | EQUAL =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14989
              if Metis_Set.equal b body then List.revAppend (acc,l)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14990
              else add (bd :: acc) bds
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14991
            | GREATER => add (bd :: acc) bds
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14992
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14993
        add [] set_defs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14994
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14995
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14996
  fun add simp (body,False,th) = add simp (negate body, True, th)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14997
    | add simp (True,_,_) = simp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14998
    | add (Simp {formula,andSet,orSet,xorSet}) (And (_,_,s), def, th) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14999
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15000
        val andSet = addSet andSet (s,def,th)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15001
        and orSet = addSet orSet (negateSet s, negate def, th)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15002
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15003
        Simp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15004
          {formula = formula,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15005
           andSet = andSet,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15006
           orSet = orSet,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15007
           xorSet = xorSet}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15008
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15009
    | add (Simp {formula,andSet,orSet,xorSet}) (Or (_,_,s), def, th) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15010
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15011
        val orSet = addSet orSet (s,def,th)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15012
        and andSet = addSet andSet (negateSet s, negate def, th)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15013
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15014
        Simp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15015
          {formula = formula,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15016
           andSet = andSet,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15017
           orSet = orSet,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15018
           xorSet = xorSet}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15019
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15020
    | add simp (Xor (_,_,p,s), def, th) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15021
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15022
        val simp = addXorSet simp (s, applyPolarity p def, th)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15023
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15024
        case def of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15025
          True =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15026
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15027
            fun addXorLiteral (fm as Metis_Literal _, simp) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15028
                let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15029
                  val s = Metis_Set.delete s fm
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15030
                in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15031
                  if not (simpler fm s) then simp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15032
                  else addXorSet simp (s, applyPolarity (not p) fm, th)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15033
                end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15034
              | addXorLiteral (_,simp) = simp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15035
          in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15036
            Metis_Set.foldl addXorLiteral simp s
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15037
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15038
        | _ => simp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15039
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15040
    | add (simp as Simp {formula,andSet,orSet,xorSet}) (body,def,th) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15041
      if Metis_Map.inDomain body formula then simp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15042
      else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15043
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15044
          val formula = Metis_Map.insert formula (body,(def,th))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15045
          val formula = Metis_Map.insert formula (negate body, (negate def, th))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15046
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15047
          Simp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15048
            {formula = formula,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15049
             andSet = andSet,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15050
             orSet = orSet,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15051
             xorSet = xorSet}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15052
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15053
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15054
  and addXorSet (simp as Simp {formula,andSet,orSet,xorSet}) (s,def,th) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15055
      if Metis_Set.size s = 1 then add simp (Metis_Set.pick s, def, th)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15056
      else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15057
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15058
          val xorSet = addSet xorSet (s,def,th)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15059
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15060
          Simp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15061
            {formula = formula,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15062
             andSet = andSet,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15063
             orSet = orSet,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15064
             xorSet = xorSet}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15065
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15066
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15067
  fun simplifyAdd simp (th as Metis_Thm (fm,_)) = add simp (fm,True,th);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15068
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15069
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15070
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15071
  fun simplifySet set_defs set =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15072
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15073
        fun pred (s,_,_) = Metis_Set.subset s set
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15074
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15075
        case List.find pred set_defs of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15076
          NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15077
        | SOME (s,f,th) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15078
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15079
            val set = Metis_Set.add (Metis_Set.difference set s) f
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15080
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15081
            SOME (set,th)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15082
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15083
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15084
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15085
  fun simplify (Simp {formula,andSet,orSet,xorSet}) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15086
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15087
        fun simp fm inf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15088
            case simp_sub fm inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15089
              NONE => simp_top fm inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15090
            | SOME (fm,inf) => try_simp_top fm inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15091
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15092
        and try_simp_top fm inf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15093
            case simp_top fm inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15094
              NONE => SOME (fm,inf)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15095
            | x => x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15096
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15097
        and simp_top fm inf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15098
            case fm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15099
              And (_,_,s) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15100
              (case simplifySet andSet s of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15101
                 NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15102
               | SOME (s,th) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15103
                 let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15104
                   val fm = AndSet s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15105
                   val inf = th :: inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15106
                 in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15107
                   try_simp_top fm inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15108
                 end)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15109
            | Or (_,_,s) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15110
              (case simplifySet orSet s of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15111
                 NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15112
               | SOME (s,th) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15113
                 let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15114
                   val fm = OrSet s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15115
                   val inf = th :: inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15116
                 in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15117
                   try_simp_top fm inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15118
                 end)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15119
            | Xor (_,_,p,s) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15120
              (case simplifySet xorSet s of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15121
                 NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15122
               | SOME (s,th) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15123
                 let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15124
                   val fm = XorPolaritySet (p,s)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15125
                   val inf = th :: inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15126
                 in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15127
                   try_simp_top fm inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15128
                 end)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15129
            | _ =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15130
              (case Metis_Map.peek formula fm of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15131
                 NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15132
               | SOME (fm,th) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15133
                 let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15134
                   val inf = th :: inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15135
                 in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15136
                   try_simp_top fm inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15137
                 end)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15138
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15139
        and simp_sub fm inf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15140
            case fm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15141
              And (_,_,s) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15142
              (case simp_set s inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15143
                 NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15144
               | SOME (l,inf) => SOME (AndList l, inf))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15145
            | Or (_,_,s) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15146
              (case simp_set s inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15147
                 NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15148
               | SOME (l,inf) => SOME (OrList l, inf))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15149
            | Xor (_,_,p,s) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15150
              (case simp_set s inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15151
                 NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15152
               | SOME (l,inf) => SOME (XorPolarityList (p,l), inf))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15153
            | Exists (_,_,n,f) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15154
              (case simp f inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15155
                 NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15156
               | SOME (f,inf) => SOME (ExistsSet (n,f), inf))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15157
            | Forall (_,_,n,f) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15158
              (case simp f inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15159
                 NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15160
               | SOME (f,inf) => SOME (ForallSet (n,f), inf))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15161
            | _ => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15162
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15163
        and simp_set s inf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15164
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15165
              val (changed,l,inf) = Metis_Set.foldr simp_set_elt (false,[],inf) s
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15166
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15167
              if changed then SOME (l,inf) else NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15168
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15169
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15170
        and simp_set_elt (fm,(changed,l,inf)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15171
            case simp fm inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15172
              NONE => (changed, fm :: l, inf)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15173
            | SOME (fm,inf) => (true, fm :: l, inf)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15174
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15175
        fn th as Metis_Thm (fm,_) =>
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15176
           case simp fm [] of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15177
             SOME (fm,ths) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15178
             let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15179
               val inf = Simplify (th,ths)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15180
             in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15181
               Metis_Thm (fm,inf)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15182
             end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15183
           | NONE => th
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15184
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15185
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15186
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15187
(*MetisTrace2
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15188
val simplify = fn simp => fn th as Metis_Thm (fm,_) =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15189
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15190
      val th' as Metis_Thm (fm',_) = simplify simp th
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15191
      val () = if compare (fm,fm') = EQUAL then ()
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15192
               else (Metis_Print.trace pp "Metis_Normalize.simplify: fm" fm;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15193
                     Metis_Print.trace pp "Metis_Normalize.simplify: fm'" fm')
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15194
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15195
      th'
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15196
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15197
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15198
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15199
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15200
(* Definitions.                                                              *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15201
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15202
39503
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15203
local
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15204
  val counter : int Unsynchronized.ref = Unsynchronized.ref 0;
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15205
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15206
  fun new () =
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15207
      let
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15208
        val Unsynchronized.ref i = counter
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15209
        val () = counter := i + 1
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15210
      in
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15211
        definitionPrefix ^ "_" ^ Int.toString i
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15212
      end;
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15213
in
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15214
  fun newDefinitionRelation () = Metis_Portable.critical new ();
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15215
end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15216
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15217
fun newDefinition def =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15218
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15219
      val fv = freeVars def
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15220
      val rel = newDefinitionRelation ()
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15221
      val atm = (Metis_Name.fromString rel, Metis_NameSet.transform Metis_Term.Var fv)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15222
      val fm = Metis_Formula.Iff (Metis_Formula.Metis_Atom atm, toFormula def)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15223
      val fm = Metis_Formula.setMkForall (fv,fm)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15224
      val inf = Definition (rel,fm)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15225
      val lit = Metis_Literal (fv,(false,atm))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15226
      val fm = Xor2 (lit,def)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15227
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15228
      Metis_Thm (fm,inf)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15229
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15230
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15231
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15232
(* Definitional conjunctive normal form.                                     *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15233
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15234
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15235
datatype cnf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15236
    ConsistentCnf of simplify
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15237
  | InconsistentCnf;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15238
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15239
val initialCnf = ConsistentCnf simplifyEmpty;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15240
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15241
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15242
  fun def_cnf_inconsistent th =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15243
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15244
        val cls = [(Metis_LiteralSet.empty,th)]
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15245
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15246
        (cls,InconsistentCnf)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15247
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15248
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15249
  fun def_cnf_clause inf (fm,acc) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15250
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15251
        val cl = toClause fm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15252
        val th = Metis_Thm (fm,inf)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15253
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15254
        (cl,th) :: acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15255
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15256
(*MetisDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15257
      handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15258
        (Metis_Print.trace pp "Metis_Normalize.addCnf.def_cnf_clause: fm" fm;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15259
         raise Bug ("Metis_Normalize.addCnf.def_cnf_clause: " ^ err));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15260
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15261
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15262
  fun def_cnf cls simp ths =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15263
      case ths of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15264
        [] => (cls, ConsistentCnf simp)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15265
      | th :: ths => def_cnf_formula cls simp (simplify simp th) ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15266
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15267
  and def_cnf_formula cls simp (th as Metis_Thm (fm,_)) ths =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15268
      case fm of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15269
        True => def_cnf cls simp ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15270
      | False => def_cnf_inconsistent th
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15271
      | And (_,_,s) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15272
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15273
          fun add (f,z) = Metis_Thm (f, Conjunct th) :: z
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15274
        in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15275
          def_cnf cls simp (Metis_Set.foldr add ths s)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15276
        end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15277
      | Exists (fv,_,n,f) =>
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15278
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15279
          val th = Metis_Thm (skolemize fv n f, Skolemize th)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15280
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15281
          def_cnf_formula cls simp th ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15282
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15283
      | Forall (_,_,_,f) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15284
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15285
          val th = Metis_Thm (f, Specialize th)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15286
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15287
          def_cnf_formula cls simp th ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15288
        end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15289
      | _ =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15290
        case minimumDefinition fm of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15291
          SOME def =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15292
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15293
            val ths = th :: ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15294
            val th = newDefinition def
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15295
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15296
            def_cnf_formula cls simp th ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15297
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15298
        | NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15299
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15300
            val simp = simplifyAdd simp th
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15301
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15302
            val fm = basicCnf fm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15303
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15304
            val inf = Clausify th
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15305
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15306
            case fm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15307
              True => def_cnf cls simp ths
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15308
            | False => def_cnf_inconsistent (Metis_Thm (fm,inf))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15309
            | And (_,_,s) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15310
              let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15311
                val inf = Conjunct (Metis_Thm (fm,inf))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15312
                val cls = Metis_Set.foldl (def_cnf_clause inf) cls s
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15313
              in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15314
                def_cnf cls simp ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15315
              end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15316
            | fm => def_cnf (def_cnf_clause inf (fm,cls)) simp ths
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15317
          end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15318
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15319
  fun addCnf th cnf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15320
      case cnf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15321
        ConsistentCnf simp => def_cnf [] simp [th]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15322
      | InconsistentCnf => ([],cnf);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15323
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15324
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15325
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15326
  fun add (th,(cls,cnf)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15327
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15328
        val (cls',cnf) = addCnf th cnf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15329
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15330
        (cls' @ cls, cnf)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15331
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15332
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15333
  fun proveCnf ths =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15334
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15335
        val (cls,_) = List.foldl add ([],initialCnf) ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15336
      in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 15337
        List.rev cls
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15338
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15339
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15340
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15341
fun cnf fm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15342
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15343
      val cls = proveCnf [mkAxiom fm]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15344
    in
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 15345
      List.map fst cls
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15346
    end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15347
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15348
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15349
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 15350
(**** Original file: src/Model.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15351
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15352
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15353
(* RANDOM FINITE MODELS                                                      *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15354
(* Copyright (c) 2003 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15355
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15356
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15357
signature Metis_Model =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15358
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15359
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15360
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15361
(* Metis_Model size.                                                               *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15362
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15363
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15364
type size = {size : int}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15365
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15366
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15367
(* A model of size N has integer elements 0...N-1.                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15368
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15369
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15370
type element = int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15371
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15372
val zeroElement : element
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15373
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15374
val incrementElement : size -> element -> element option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15375
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15376
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15377
(* The parts of the model that are fixed.                                    *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15378
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15379
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15380
type fixedFunction = size -> element list -> element option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15381
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15382
type fixedRelation = size -> element list -> bool option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15383
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15384
datatype fixed =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15385
    Fixed of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15386
      {functions : fixedFunction Metis_NameArityMap.map,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15387
       relations : fixedRelation Metis_NameArityMap.map}
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15388
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15389
val emptyFixed : fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15390
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15391
val unionFixed : fixed -> fixed -> fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15392
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15393
val getFunctionFixed : fixed -> Metis_NameArity.nameArity -> fixedFunction
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15394
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15395
val getRelationFixed : fixed -> Metis_NameArity.nameArity -> fixedRelation
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15396
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15397
val insertFunctionFixed : fixed -> Metis_NameArity.nameArity * fixedFunction -> fixed
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15398
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15399
val insertRelationFixed : fixed -> Metis_NameArity.nameArity * fixedRelation -> fixed
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15400
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15401
val unionListFixed : fixed list -> fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15402
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15403
val basicFixed : fixed  (* interprets equality and hasType *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15404
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15405
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15406
(* Renaming fixed model parts.                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15407
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15408
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15409
type fixedMap =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15410
     {functionMap : Metis_Name.name Metis_NameArityMap.map,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15411
      relationMap : Metis_Name.name Metis_NameArityMap.map}
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15412
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15413
val mapFixed : fixedMap -> fixed -> fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15414
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15415
val ppFixedMap : fixedMap Metis_Print.pp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15416
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15417
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15418
(* Standard fixed model parts.                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15419
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15420
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15421
(* Projections *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15422
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15423
val projectionMin : int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15424
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15425
val projectionMax : int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15426
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15427
val projectionName : int -> Metis_Name.name
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15428
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15429
val projectionFixed : fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15430
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15431
(* Arithmetic *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15432
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15433
val numeralMin : int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15434
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15435
val numeralMax : int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15436
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15437
val numeralName : int -> Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15438
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15439
val addName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15440
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15441
val divName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15442
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15443
val dividesName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15444
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15445
val evenName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15446
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15447
val expName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15448
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15449
val geName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15450
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15451
val gtName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15452
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15453
val isZeroName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15454
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15455
val leName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15456
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15457
val ltName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15458
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15459
val modName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15460
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15461
val multName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15462
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15463
val negName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15464
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15465
val oddName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15466
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15467
val preName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15468
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15469
val subName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15470
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15471
val sucName : Metis_Name.name
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15472
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15473
val modularFixed : fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15474
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15475
val overflowFixed : fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15476
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15477
(* Sets *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15478
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15479
val cardName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15480
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15481
val complementName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15482
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15483
val differenceName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15484
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15485
val emptyName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15486
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15487
val memberName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15488
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15489
val insertName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15490
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15491
val intersectName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15492
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15493
val singletonName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15494
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15495
val subsetName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15496
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15497
val symmetricDifferenceName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15498
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15499
val unionName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15500
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15501
val universeName : Metis_Name.name
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15502
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15503
val setFixed : fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15504
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15505
(* Lists *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15506
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15507
val appendName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15508
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15509
val consName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15510
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15511
val lengthName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15512
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15513
val nilName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15514
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15515
val nullName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15516
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15517
val tailName : Metis_Name.name
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15518
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15519
val listFixed : fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15520
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15521
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15522
(* Valuations.                                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15523
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15524
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15525
type valuation
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15526
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15527
val emptyValuation : valuation
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15528
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15529
val zeroValuation : Metis_NameSet.set -> valuation
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15530
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15531
val constantValuation : element -> Metis_NameSet.set -> valuation
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15532
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15533
val peekValuation : valuation -> Metis_Name.name -> element option
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15534
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15535
val getValuation : valuation -> Metis_Name.name -> element
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15536
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15537
val insertValuation : valuation -> Metis_Name.name * element -> valuation
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15538
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15539
val randomValuation : {size : int} -> Metis_NameSet.set -> valuation
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15540
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15541
val incrementValuation :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15542
    {size : int} -> Metis_NameSet.set -> valuation -> valuation option
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15543
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15544
val foldValuation :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15545
    {size : int} -> Metis_NameSet.set -> (valuation * 'a -> 'a) -> 'a -> 'a
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15546
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15547
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15548
(* A type of random finite models.                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15549
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15550
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15551
type parameters = {size : int, fixed : fixed}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15552
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15553
type model
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15554
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15555
val default : parameters
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15556
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15557
val new : parameters -> model
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15558
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15559
val size : model -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15560
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15561
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15562
(* Interpreting terms and formulas in the model.                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15563
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15564
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15565
val interpretFunction : model -> Metis_Term.functionName * element list -> element
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15566
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15567
val interpretRelation : model -> Metis_Atom.relationName * element list -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15568
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15569
val interpretTerm : model -> valuation -> Metis_Term.term -> element
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15570
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15571
val interpretAtom : model -> valuation -> Metis_Atom.atom -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15572
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15573
val interpretFormula : model -> valuation -> Metis_Formula.formula -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15574
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15575
val interpretLiteral : model -> valuation -> Metis_Literal.literal -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15576
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15577
val interpretClause : model -> valuation -> Metis_Thm.clause -> bool
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15578
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15579
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15580
(* Check whether random groundings of a formula are true in the model.       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15581
(* Note: if it's cheaper, a systematic check will be performed instead.      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15582
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15583
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15584
val check :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15585
    (model -> valuation -> 'a -> bool) -> {maxChecks : int option} -> model ->
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15586
    Metis_NameSet.set -> 'a -> {T : int, F : int}
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15587
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15588
val checkAtom :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15589
    {maxChecks : int option} -> model -> Metis_Atom.atom -> {T : int, F : int}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15590
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15591
val checkFormula :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15592
    {maxChecks : int option} -> model -> Metis_Formula.formula -> {T : int, F : int}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15593
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15594
val checkLiteral :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15595
    {maxChecks : int option} -> model -> Metis_Literal.literal -> {T : int, F : int}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15596
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15597
val checkClause :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15598
    {maxChecks : int option} -> model -> Metis_Thm.clause -> {T : int, F : int}
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15599
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15600
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15601
(* Updating the model.                                                       *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15602
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15603
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15604
val updateFunction :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15605
    model -> (Metis_Term.functionName * element list) * element -> unit
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15606
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15607
val updateRelation :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15608
    model -> (Metis_Atom.relationName * element list) * bool -> unit
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15609
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15610
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15611
(* Choosing a random perturbation to make a formula true in the model.       *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15612
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15613
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15614
val perturbTerm : model -> valuation -> Metis_Term.term * element list -> unit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15615
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15616
val perturbAtom : model -> valuation -> Metis_Atom.atom * bool -> unit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15617
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15618
val perturbLiteral : model -> valuation -> Metis_Literal.literal -> unit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15619
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15620
val perturbClause : model -> valuation -> Metis_Thm.clause -> unit
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15621
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15622
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15623
(* Pretty printing.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15624
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15625
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15626
val pp : model Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15627
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15628
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15629
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 15630
(**** Original file: src/Model.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15631
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15632
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15633
(* RANDOM FINITE MODELS                                                      *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15634
(* Copyright (c) 2003 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15635
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15636
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15637
structure Metis_Model :> Metis_Model =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15638
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15639
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15640
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15641
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15642
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15643
(* Constants.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15644
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15645
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15646
val maxSpace = 1000;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15647
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15648
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15649
(* Helper functions.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15650
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15651
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15652
val multInt =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15653
    case Int.maxInt of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15654
      NONE => (fn x => fn y => SOME (x * y))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15655
    | SOME m =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15656
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15657
        val m = Real.floor (Math.sqrt (Real.fromInt m))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15658
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15659
        fn x => fn y => if x <= m andalso y <= m then SOME (x * y) else NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15660
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15661
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15662
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15663
  fun iexp x y acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15664
      if y mod 2 = 0 then iexp' x y acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15665
      else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15666
        case multInt acc x of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15667
          SOME acc => iexp' x y acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15668
        | NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15669
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15670
  and iexp' x y acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15671
      if y = 1 then SOME acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15672
      else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15673
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15674
          val y = y div 2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15675
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15676
          case multInt x x of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15677
            SOME x => iexp x y acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15678
          | NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15679
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15680
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15681
  fun expInt x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15682
      if y <= 1 then
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15683
        if y = 0 then SOME 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15684
        else if y = 1 then SOME x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15685
        else raise Bug "expInt: negative exponent"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15686
      else if x <= 1 then
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15687
        if 0 <= x then SOME x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15688
        else raise Bug "expInt: negative exponand"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15689
      else iexp x y 1;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15690
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15691
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15692
fun boolToInt true = 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15693
  | boolToInt false = 0;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15694
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15695
fun intToBool 1 = true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15696
  | intToBool 0 = false
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15697
  | intToBool _ = raise Bug "Metis_Model.intToBool";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15698
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15699
fun minMaxInterval i j = interval i (1 + j - i);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15700
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15701
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15702
(* Metis_Model size.                                                               *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15703
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15704
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15705
type size = {size : int};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15706
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15707
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15708
(* A model of size N has integer elements 0...N-1.                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15709
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15710
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15711
type element = int;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15712
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15713
val zeroElement = 0;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15714
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15715
fun incrementElement {size = N} i =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15716
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15717
      val i = i + 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15718
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15719
      if i = N then NONE else SOME i
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15720
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15721
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15722
fun elementListSpace {size = N} arity =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15723
    case expInt N arity of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15724
      NONE => NONE
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15725
    | s as SOME m => if m <= maxSpace then s else NONE;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15726
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15727
fun elementListIndex {size = N} =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15728
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15729
      fun f acc elts =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15730
          case elts of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15731
            [] => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15732
          | elt :: elts => f (N * acc + elt) elts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15733
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15734
      f 0
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15735
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15736
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15737
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15738
(* The parts of the model that are fixed.                                    *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15739
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15740
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15741
type fixedFunction = size -> element list -> element option;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15742
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15743
type fixedRelation = size -> element list -> bool option;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15744
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15745
datatype fixed =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15746
    Fixed of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15747
      {functions : fixedFunction Metis_NameArityMap.map,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15748
       relations : fixedRelation Metis_NameArityMap.map};
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15749
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15750
val uselessFixedFunction : fixedFunction = K (K NONE);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15751
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15752
val uselessFixedRelation : fixedRelation = K (K NONE);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15753
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15754
val emptyFunctions : fixedFunction Metis_NameArityMap.map = Metis_NameArityMap.new ();
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15755
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15756
val emptyRelations : fixedRelation Metis_NameArityMap.map = Metis_NameArityMap.new ();
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15757
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15758
fun fixed0 f sz elts =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15759
    case elts of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15760
      [] => f sz
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15761
    | _ => raise Bug "Metis_Model.fixed0: wrong arity";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15762
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15763
fun fixed1 f sz elts =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15764
    case elts of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15765
      [x] => f sz x
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15766
    | _ => raise Bug "Metis_Model.fixed1: wrong arity";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15767
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15768
fun fixed2 f sz elts =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15769
    case elts of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15770
      [x,y] => f sz x y
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15771
    | _ => raise Bug "Metis_Model.fixed2: wrong arity";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15772
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15773
val emptyFixed =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15774
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15775
      val fns = emptyFunctions
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15776
      and rels = emptyRelations
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15777
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15778
      Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15779
        {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15780
         relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15781
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15782
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15783
fun peekFunctionFixed fix name_arity =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15784
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15785
      val Fixed {functions = fns, ...} = fix
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15786
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15787
      Metis_NameArityMap.peek fns name_arity
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15788
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15789
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15790
fun peekRelationFixed fix name_arity =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15791
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15792
      val Fixed {relations = rels, ...} = fix
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15793
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15794
      Metis_NameArityMap.peek rels name_arity
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15795
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15796
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15797
fun getFunctionFixed fix name_arity =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15798
    case peekFunctionFixed fix name_arity of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15799
      SOME f => f
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15800
    | NONE => uselessFixedFunction;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15801
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15802
fun getRelationFixed fix name_arity =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15803
    case peekRelationFixed fix name_arity of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15804
      SOME rel => rel
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15805
    | NONE => uselessFixedRelation;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15806
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15807
fun insertFunctionFixed fix name_arity_fn =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15808
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15809
      val Fixed {functions = fns, relations = rels} = fix
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15810
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15811
      val fns = Metis_NameArityMap.insert fns name_arity_fn
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15812
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15813
      Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15814
        {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15815
         relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15816
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15817
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15818
fun insertRelationFixed fix name_arity_rel =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15819
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15820
      val Fixed {functions = fns, relations = rels} = fix
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15821
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15822
      val rels = Metis_NameArityMap.insert rels name_arity_rel
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15823
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15824
      Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15825
        {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15826
         relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15827
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15828
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15829
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15830
  fun union _ = raise Bug "Metis_Model.unionFixed: nameArity clash";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15831
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15832
  fun unionFixed fix1 fix2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15833
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15834
        val Fixed {functions = fns1, relations = rels1} = fix1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15835
        and Fixed {functions = fns2, relations = rels2} = fix2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15836
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15837
        val fns = Metis_NameArityMap.union union fns1 fns2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15838
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15839
        val rels = Metis_NameArityMap.union union rels1 rels2
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15840
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15841
        Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15842
          {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15843
           relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15844
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15845
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15846
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15847
val unionListFixed =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15848
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15849
      fun union (fix,acc) = unionFixed acc fix
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15850
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15851
      List.foldl union emptyFixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15852
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15853
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15854
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15855
  fun hasTypeFn _ elts =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15856
      case elts of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15857
        [x,_] => SOME x
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15858
      | _ => raise Bug "Metis_Model.hasTypeFn: wrong arity";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15859
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15860
  fun eqRel _ elts =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15861
      case elts of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15862
        [x,y] => SOME (x = y)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15863
      | _ => raise Bug "Metis_Model.eqRel: wrong arity";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15864
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15865
  val basicFixed =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15866
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15867
        val fns = Metis_NameArityMap.singleton (Metis_Term.hasTypeFunction,hasTypeFn)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15868
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15869
        val rels = Metis_NameArityMap.singleton (Metis_Atom.eqRelation,eqRel)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15870
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15871
        Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15872
          {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15873
           relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15874
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15875
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15876
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15877
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15878
(* Renaming fixed model parts.                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15879
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15880
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15881
type fixedMap =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15882
     {functionMap : Metis_Name.name Metis_NameArityMap.map,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15883
      relationMap : Metis_Name.name Metis_NameArityMap.map};
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15884
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15885
fun mapFixed fixMap fix =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15886
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15887
      val {functionMap = fnMap, relationMap = relMap} = fixMap
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15888
      and Fixed {functions = fns, relations = rels} = fix
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15889
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15890
      val fns = Metis_NameArityMap.compose fnMap fns
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15891
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15892
      val rels = Metis_NameArityMap.compose relMap rels
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15893
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15894
      Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15895
        {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15896
         relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15897
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15898
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15899
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15900
  fun mkEntry tag (na,n) = (tag,na,n);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15901
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 15902
  fun mkList tag m = List.map (mkEntry tag) (Metis_NameArityMap.toList m);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15903
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15904
  fun ppEntry (tag,source_arity,target) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 15905
      Metis_Print.inconsistentBlock 2
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 15906
        [Metis_Print.ppString tag,
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 15907
         Metis_Print.break,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15908
         Metis_NameArity.pp source_arity,
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 15909
         Metis_Print.ppString " ->",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 15910
         Metis_Print.break,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15911
         Metis_Name.pp target];
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15912
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15913
  fun ppFixedMap fixMap =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15914
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15915
        val {functionMap = fnMap, relationMap = relMap} = fixMap
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15916
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15917
        case mkList "function" fnMap @ mkList "relation" relMap of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15918
          [] => Metis_Print.skip
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15919
        | entry :: entries =>
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 15920
          Metis_Print.consistentBlock 0
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15921
            (ppEntry entry ::
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 15922
             List.map (Metis_Print.sequence Metis_Print.newline o ppEntry) entries)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15923
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15924
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15925
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15926
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15927
(* Standard fixed model parts.                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15928
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15929
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15930
(* Projections *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15931
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15932
val projectionMin = 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15933
and projectionMax = 9;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15934
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15935
val projectionList = minMaxInterval projectionMin projectionMax;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15936
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15937
fun projectionName i =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15938
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15939
      val _ = projectionMin <= i orelse
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15940
              raise Bug "Metis_Model.projectionName: less than projectionMin"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15941
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15942
      val _ = i <= projectionMax orelse
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15943
              raise Bug "Metis_Model.projectionName: greater than projectionMax"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15944
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15945
      Metis_Name.fromString ("project" ^ Int.toString i)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15946
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15947
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15948
fun projectionFn i _ elts = SOME (List.nth (elts, i - 1));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15949
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15950
fun arityProjectionFixed arity =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15951
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15952
      fun mkProj i = ((projectionName i, arity), projectionFn i)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15953
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15954
      fun addProj i acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15955
          if i > arity then acc
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15956
          else addProj (i + 1) (Metis_NameArityMap.insert acc (mkProj i))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15957
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15958
      val fns = addProj projectionMin emptyFunctions
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15959
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15960
      val rels = emptyRelations
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15961
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15962
      Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15963
        {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15964
         relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15965
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15966
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15967
val projectionFixed =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 15968
    unionListFixed (List.map arityProjectionFixed projectionList);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15969
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15970
(* Arithmetic *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15971
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15972
val numeralMin = ~100
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15973
and numeralMax = 100;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15974
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15975
val numeralList = minMaxInterval numeralMin numeralMax;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15976
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15977
fun numeralName i =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15978
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15979
      val _ = numeralMin <= i orelse
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15980
              raise Bug "Metis_Model.numeralName: less than numeralMin"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15981
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15982
      val _ = i <= numeralMax orelse
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15983
              raise Bug "Metis_Model.numeralName: greater than numeralMax"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15984
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15985
      val s = if i < 0 then "negative" ^ Int.toString (~i) else Int.toString i
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15986
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15987
      Metis_Name.fromString s
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15988
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15989
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15990
val addName = Metis_Name.fromString "+"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15991
and divName = Metis_Name.fromString "div"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15992
and dividesName = Metis_Name.fromString "divides"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15993
and evenName = Metis_Name.fromString "even"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15994
and expName = Metis_Name.fromString "exp"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15995
and geName = Metis_Name.fromString ">="
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15996
and gtName = Metis_Name.fromString ">"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15997
and isZeroName = Metis_Name.fromString "isZero"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15998
and leName = Metis_Name.fromString "<="
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15999
and ltName = Metis_Name.fromString "<"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16000
and modName = Metis_Name.fromString "mod"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16001
and multName = Metis_Name.fromString "*"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16002
and negName = Metis_Name.fromString "~"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16003
and oddName = Metis_Name.fromString "odd"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16004
and preName = Metis_Name.fromString "pre"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16005
and subName = Metis_Name.fromString "-"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16006
and sucName = Metis_Name.fromString "suc";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16007
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16008
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16009
  (* Support *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16010
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16011
  fun modN {size = N} x = x mod N;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16012
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16013
  fun oneN sz = modN sz 1;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16014
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16015
  fun multN sz (x,y) = modN sz (x * y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16016
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16017
  (* Functions *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16018
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16019
  fun numeralFn i sz = SOME (modN sz i);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16020
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16021
  fun addFn sz x y = SOME (modN sz (x + y));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16022
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16023
  fun divFn {size = N} x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16024
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16025
        val y = if y = 0 then N else y
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16026
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16027
        SOME (x div y)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16028
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16029
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16030
  fun expFn sz x y = SOME (exp (multN sz) x y (oneN sz));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16031
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16032
  fun modFn {size = N} x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16033
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16034
        val y = if y = 0 then N else y
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16035
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16036
        SOME (x mod y)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16037
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16038
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16039
  fun multFn sz x y = SOME (multN sz (x,y));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16040
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16041
  fun negFn {size = N} x = SOME (if x = 0 then 0 else N - x);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16042
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16043
  fun preFn {size = N} x = SOME (if x = 0 then N - 1 else x - 1);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16044
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16045
  fun subFn {size = N} x y = SOME (if x < y then N + x - y else x - y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16046
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16047
  fun sucFn {size = N} x = SOME (if x = N - 1 then 0 else x + 1);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16048
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16049
  (* Relations *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16050
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16051
  fun dividesRel _ x y = SOME (divides x y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16052
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16053
  fun evenRel _ x = SOME (x mod 2 = 0);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16054
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16055
  fun geRel _ x y = SOME (x >= y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16056
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16057
  fun gtRel _ x y = SOME (x > y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16058
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16059
  fun isZeroRel _ x = SOME (x = 0);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16060
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16061
  fun leRel _ x y = SOME (x <= y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16062
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16063
  fun ltRel _ x y = SOME (x < y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16064
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16065
  fun oddRel _ x = SOME (x mod 2 = 1);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16066
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16067
  val modularFixed =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16068
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16069
        val fns =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16070
            Metis_NameArityMap.fromList
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 16071
              (List.map (fn i => ((numeralName i,0), fixed0 (numeralFn i)))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16072
                 numeralList @
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16073
               [((addName,2), fixed2 addFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16074
                ((divName,2), fixed2 divFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16075
                ((expName,2), fixed2 expFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16076
                ((modName,2), fixed2 modFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16077
                ((multName,2), fixed2 multFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16078
                ((negName,1), fixed1 negFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16079
                ((preName,1), fixed1 preFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16080
                ((subName,2), fixed2 subFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16081
                ((sucName,1), fixed1 sucFn)])
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16082
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16083
        val rels =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16084
            Metis_NameArityMap.fromList
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16085
              [((dividesName,2), fixed2 dividesRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16086
               ((evenName,1), fixed1 evenRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16087
               ((geName,2), fixed2 geRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16088
               ((gtName,2), fixed2 gtRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16089
               ((isZeroName,1), fixed1 isZeroRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16090
               ((leName,2), fixed2 leRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16091
               ((ltName,2), fixed2 ltRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16092
               ((oddName,1), fixed1 oddRel)]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16093
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16094
        Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16095
          {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16096
           relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16097
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16098
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16099
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16100
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16101
  (* Support *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16102
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16103
  fun cutN {size = N} x = if x >= N then N - 1 else x;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16104
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16105
  fun oneN sz = cutN sz 1;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16106
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16107
  fun multN sz (x,y) = cutN sz (x * y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16108
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16109
  (* Functions *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16110
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16111
  fun numeralFn i sz = if i < 0 then NONE else SOME (cutN sz i);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16112
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16113
  fun addFn sz x y = SOME (cutN sz (x + y));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16114
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16115
  fun divFn _ x y = if y = 0 then NONE else SOME (x div y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16116
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16117
  fun expFn sz x y = SOME (exp (multN sz) x y (oneN sz));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16118
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16119
  fun modFn {size = N} x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16120
      if y = 0 orelse x = N - 1 then NONE else SOME (x mod y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16121
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16122
  fun multFn sz x y = SOME (multN sz (x,y));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16123
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16124
  fun negFn _ x = if x = 0 then SOME 0 else NONE;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16125
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16126
  fun preFn _ x = if x = 0 then NONE else SOME (x - 1);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16127
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16128
  fun subFn {size = N} x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16129
      if y = 0 then SOME x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16130
      else if x = N - 1 orelse x < y then NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16131
      else SOME (x - y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16132
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16133
  fun sucFn sz x = SOME (cutN sz (x + 1));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16134
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16135
  (* Relations *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16136
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16137
  fun dividesRel {size = N} x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16138
      if x = 1 orelse y = 0 then SOME true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16139
      else if x = 0 then SOME false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16140
      else if y = N - 1 then NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16141
      else SOME (divides x y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16142
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16143
  fun evenRel {size = N} x =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16144
      if x = N - 1 then NONE else SOME (x mod 2 = 0);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16145
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16146
  fun geRel {size = N} y x =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16147
      if x = N - 1 then if y = N - 1 then NONE else SOME false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16148
      else if y = N - 1 then SOME true else SOME (x <= y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16149
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16150
  fun gtRel {size = N} y x =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16151
      if x = N - 1 then if y = N - 1 then NONE else SOME false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16152
      else if y = N - 1 then SOME true else SOME (x < y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16153
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16154
  fun isZeroRel _ x = SOME (x = 0);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16155
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16156
  fun leRel {size = N} x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16157
      if x = N - 1 then if y = N - 1 then NONE else SOME false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16158
      else if y = N - 1 then SOME true else SOME (x <= y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16159
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16160
  fun ltRel {size = N} x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16161
      if x = N - 1 then if y = N - 1 then NONE else SOME false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16162
      else if y = N - 1 then SOME true else SOME (x < y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16163
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16164
  fun oddRel {size = N} x =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16165
      if x = N - 1 then NONE else SOME (x mod 2 = 1);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16166
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16167
  val overflowFixed =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16168
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16169
        val fns =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16170
            Metis_NameArityMap.fromList
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 16171
              (List.map (fn i => ((numeralName i,0), fixed0 (numeralFn i)))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16172
                 numeralList @
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16173
               [((addName,2), fixed2 addFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16174
                ((divName,2), fixed2 divFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16175
                ((expName,2), fixed2 expFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16176
                ((modName,2), fixed2 modFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16177
                ((multName,2), fixed2 multFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16178
                ((negName,1), fixed1 negFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16179
                ((preName,1), fixed1 preFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16180
                ((subName,2), fixed2 subFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16181
                ((sucName,1), fixed1 sucFn)])
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16182
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16183
        val rels =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16184
            Metis_NameArityMap.fromList
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16185
              [((dividesName,2), fixed2 dividesRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16186
               ((evenName,1), fixed1 evenRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16187
               ((geName,2), fixed2 geRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16188
               ((gtName,2), fixed2 gtRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16189
               ((isZeroName,1), fixed1 isZeroRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16190
               ((leName,2), fixed2 leRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16191
               ((ltName,2), fixed2 ltRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16192
               ((oddName,1), fixed1 oddRel)]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16193
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16194
        Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16195
          {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16196
           relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16197
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16198
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16199
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16200
(* Sets *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16201
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16202
val cardName = Metis_Name.fromString "card"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16203
and complementName = Metis_Name.fromString "complement"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16204
and differenceName = Metis_Name.fromString "difference"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16205
and emptyName = Metis_Name.fromString "empty"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16206
and memberName = Metis_Name.fromString "member"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16207
and insertName = Metis_Name.fromString "insert"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16208
and intersectName = Metis_Name.fromString "intersect"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16209
and singletonName = Metis_Name.fromString "singleton"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16210
and subsetName = Metis_Name.fromString "subset"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16211
and symmetricDifferenceName = Metis_Name.fromString "symmetricDifference"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16212
and unionName = Metis_Name.fromString "union"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16213
and universeName = Metis_Name.fromString "universe";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16214
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16215
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16216
  (* Support *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16217
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16218
  fun eltN {size = N} =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16219
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16220
        fun f 0 acc = acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16221
          | f x acc = f (x div 2) (acc + 1)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16222
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16223
        f N ~1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16224
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16225
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16226
  fun posN i = Word.<< (0w1, Word.fromInt i);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16227
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16228
  fun univN sz = Word.- (posN (eltN sz), 0w1);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16229
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16230
  fun setN sz x = Word.andb (Word.fromInt x, univN sz);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16231
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16232
  (* Functions *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16233
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16234
  fun cardFn sz x =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16235
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16236
        fun f 0w0 acc = acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16237
          | f s acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16238
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16239
              val acc = if Word.andb (s,0w1) = 0w0 then acc else acc + 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16240
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16241
              f (Word.>> (s,0w1)) acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16242
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16243
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16244
        SOME (f (setN sz x) 0)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16245
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16246
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16247
  fun complementFn sz x = SOME (Word.toInt (Word.xorb (univN sz, setN sz x)));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16248
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16249
  fun differenceFn sz x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16250
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16251
        val x = setN sz x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16252
        and y = setN sz y
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16253
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16254
        SOME (Word.toInt (Word.andb (x, Word.notb y)))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16255
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16256
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16257
  fun emptyFn _ = SOME 0;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16258
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16259
  fun insertFn sz x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16260
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16261
        val x = x mod eltN sz
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16262
        and y = setN sz y
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16263
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16264
        SOME (Word.toInt (Word.orb (posN x, y)))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16265
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16266
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16267
  fun intersectFn sz x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16268
      SOME (Word.toInt (Word.andb (setN sz x, setN sz y)));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16269
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16270
  fun singletonFn sz x =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16271
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16272
        val x = x mod eltN sz
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16273
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16274
        SOME (Word.toInt (posN x))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16275
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16276
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16277
  fun symmetricDifferenceFn sz x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16278
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16279
        val x = setN sz x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16280
        and y = setN sz y
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16281
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16282
        SOME (Word.toInt (Word.xorb (x,y)))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16283
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16284
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16285
  fun unionFn sz x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16286
      SOME (Word.toInt (Word.orb (setN sz x, setN sz y)));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16287
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16288
  fun universeFn sz = SOME (Word.toInt (univN sz));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16289
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16290
  (* Relations *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16291
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16292
  fun memberRel sz x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16293
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16294
        val x = x mod eltN sz
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16295
        and y = setN sz y
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16296
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16297
        SOME (Word.andb (posN x, y) <> 0w0)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16298
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16299
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16300
  fun subsetRel sz x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16301
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16302
        val x = setN sz x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16303
        and y = setN sz y
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16304
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16305
        SOME (Word.andb (x, Word.notb y) = 0w0)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16306
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16307
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16308
  val setFixed =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16309
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16310
        val fns =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16311
            Metis_NameArityMap.fromList
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16312
              [((cardName,1), fixed1 cardFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16313
               ((complementName,1), fixed1 complementFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16314
               ((differenceName,2), fixed2 differenceFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16315
               ((emptyName,0), fixed0 emptyFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16316
               ((insertName,2), fixed2 insertFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16317
               ((intersectName,2), fixed2 intersectFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16318
               ((singletonName,1), fixed1 singletonFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16319
               ((symmetricDifferenceName,2), fixed2 symmetricDifferenceFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16320
               ((unionName,2), fixed2 unionFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16321
               ((universeName,0), fixed0 universeFn)]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16322
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16323
        val rels =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16324
            Metis_NameArityMap.fromList
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16325
              [((memberName,2), fixed2 memberRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16326
               ((subsetName,2), fixed2 subsetRel)]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16327
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16328
        Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16329
          {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16330
           relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16331
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16332
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16333
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16334
(* Lists *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16335
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16336
val appendName = Metis_Name.fromString "@"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16337
and consName = Metis_Name.fromString "::"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16338
and lengthName = Metis_Name.fromString "length"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16339
and nilName = Metis_Name.fromString "nil"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16340
and nullName = Metis_Name.fromString "null"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16341
and tailName = Metis_Name.fromString "tail";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16342
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16343
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16344
  val baseFix =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16345
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16346
        val fix = unionFixed projectionFixed overflowFixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16347
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16348
        val sucFn = getFunctionFixed fix (sucName,1)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16349
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16350
        fun suc2Fn sz _ x = sucFn sz [x]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16351
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16352
        insertFunctionFixed fix ((sucName,2), fixed2 suc2Fn)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16353
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16354
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16355
  val fixMap =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16356
      {functionMap = Metis_NameArityMap.fromList
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16357
                       [((appendName,2),addName),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16358
                        ((consName,2),sucName),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16359
                        ((lengthName,1), projectionName 1),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16360
                        ((nilName,0), numeralName 0),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16361
                        ((tailName,1),preName)],
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16362
       relationMap = Metis_NameArityMap.fromList
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16363
                       [((nullName,1),isZeroName)]};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16364
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16365
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16366
  val listFixed = mapFixed fixMap baseFix;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16367
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16368
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16369
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16370
(* Valuations.                                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16371
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16372
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16373
datatype valuation = Valuation of element Metis_NameMap.map;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16374
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16375
val emptyValuation = Valuation (Metis_NameMap.new ());
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16376
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16377
fun insertValuation (Valuation m) v_i = Valuation (Metis_NameMap.insert m v_i);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16378
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16379
fun peekValuation (Valuation m) v = Metis_NameMap.peek m v;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16380
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16381
fun constantValuation i =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16382
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16383
      fun add (v,V) = insertValuation V (v,i)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16384
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16385
      Metis_NameSet.foldl add emptyValuation
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16386
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16387
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16388
val zeroValuation = constantValuation zeroElement;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16389
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16390
fun getValuation V v =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16391
    case peekValuation V v of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16392
      SOME i => i
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16393
    | NONE => raise Error "Metis_Model.getValuation: incomplete valuation";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16394
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16395
fun randomValuation {size = N} vs =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16396
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16397
      fun f (v,V) = insertValuation V (v, Metis_Portable.randomInt N)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16398
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16399
      Metis_NameSet.foldl f emptyValuation vs
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16400
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16401
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16402
fun incrementValuation N vars =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16403
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16404
      fun inc vs V =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16405
          case vs of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16406
            [] => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16407
          | v :: vs =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16408
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16409
              val (carry,i) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16410
                  case incrementElement N (getValuation V v) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16411
                    SOME i => (false,i)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16412
                  | NONE => (true,zeroElement)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16413
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16414
              val V = insertValuation V (v,i)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16415
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16416
              if carry then inc vs V else SOME V
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16417
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16418
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16419
      inc (Metis_NameSet.toList vars)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16420
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16421
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16422
fun foldValuation N vars f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16423
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16424
      val inc = incrementValuation N vars
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16425
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16426
      fun fold V acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16427
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16428
            val acc = f (V,acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16429
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16430
            case inc V of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16431
              NONE => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16432
            | SOME V => fold V acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16433
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16434
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16435
      val zero = zeroValuation vars
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16436
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16437
      fold zero
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16438
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16439
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16440
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16441
(* A type of random finite mapping Z^n -> Z.                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16442
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16443
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16444
val UNKNOWN = ~1;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16445
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16446
datatype table =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16447
    ForgetfulTable
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16448
  | ArrayTable of int Array.array;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16449
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16450
fun newTable N arity =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16451
    case elementListSpace {size = N} arity of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16452
      NONE => ForgetfulTable
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16453
    | SOME space => ArrayTable (Array.array (space,UNKNOWN));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16454
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16455
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16456
  fun randomResult R = Metis_Portable.randomInt R;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16457
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16458
  fun lookupTable N R table elts =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16459
      case table of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16460
        ForgetfulTable => randomResult R
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16461
      | ArrayTable a =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16462
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16463
          val i = elementListIndex {size = N} elts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16464
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16465
          val r = Array.sub (a,i)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16466
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16467
          if r <> UNKNOWN then r
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16468
          else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16469
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16470
              val r = randomResult R
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16471
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16472
              val () = Array.update (a,i,r)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16473
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16474
              r
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16475
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16476
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16477
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16478
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16479
fun updateTable N table (elts,r) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16480
    case table of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16481
      ForgetfulTable => ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16482
    | ArrayTable a =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16483
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16484
        val i = elementListIndex {size = N} elts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16485
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16486
        val () = Array.update (a,i,r)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16487
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16488
        ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16489
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16490
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16491
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16492
(* A type of random finite mappings name * arity -> Z^arity -> Z.            *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16493
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16494
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16495
datatype tables =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16496
    Tables of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16497
      {domainSize : int,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16498
       rangeSize : int,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16499
       tableMap : table Metis_NameArityMap.map Unsynchronized.ref};
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16500
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16501
fun newTables N R =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16502
    Tables
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16503
      {domainSize = N,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16504
       rangeSize = R,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16505
       tableMap = Unsynchronized.ref (Metis_NameArityMap.new ())};
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16506
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16507
fun getTables tables n_a =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16508
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16509
      val Tables {domainSize = N, rangeSize = _, tableMap = tm} = tables
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16510
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16511
      val Unsynchronized.ref m = tm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16512
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16513
      case Metis_NameArityMap.peek m n_a of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16514
        SOME t => t
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16515
      | NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16516
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16517
          val (_,a) = n_a
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16518
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16519
          val t = newTable N a
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16520
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16521
          val m = Metis_NameArityMap.insert m (n_a,t)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16522
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16523
          val () = tm := m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16524
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16525
          t
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16526
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16527
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16528
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16529
fun lookupTables tables (n,elts) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16530
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16531
      val Tables {domainSize = N, rangeSize = R, ...} = tables
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16532
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16533
      val a = length elts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16534
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16535
      val table = getTables tables (n,a)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16536
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16537
      lookupTable N R table elts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16538
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16539
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16540
fun updateTables tables ((n,elts),r) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16541
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16542
      val Tables {domainSize = N, ...} = tables
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16543
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16544
      val a = length elts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16545
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16546
      val table = getTables tables (n,a)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16547
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16548
      updateTable N table (elts,r)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16549
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16550
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16551
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16552
(* A type of random finite models.                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16553
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16554
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16555
type parameters = {size : int, fixed : fixed};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16556
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16557
datatype model =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16558
    Metis_Model of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16559
      {size : int,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16560
       fixedFunctions : (element list -> element option) Metis_NameArityMap.map,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16561
       fixedRelations : (element list -> bool option) Metis_NameArityMap.map,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16562
       randomFunctions : tables,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16563
       randomRelations : tables};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16564
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16565
fun new {size = N, fixed} =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16566
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16567
      val Fixed {functions = fns, relations = rels} = fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16568
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16569
      val fixFns = Metis_NameArityMap.transform (fn f => f {size = N}) fns
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16570
      and fixRels = Metis_NameArityMap.transform (fn r => r {size = N}) rels
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16571
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16572
      val rndFns = newTables N N
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16573
      and rndRels = newTables N 2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16574
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16575
      Metis_Model
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16576
        {size = N,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16577
         fixedFunctions = fixFns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16578
         fixedRelations = fixRels,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16579
         randomFunctions = rndFns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16580
         randomRelations = rndRels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16581
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16582
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16583
fun size (Metis_Model {size = N, ...}) = N;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16584
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16585
fun peekFixedFunction M (n,elts) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16586
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16587
      val Metis_Model {fixedFunctions = fixFns, ...} = M
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16588
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16589
      case Metis_NameArityMap.peek fixFns (n, length elts) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16590
        NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16591
      | SOME fixFn => fixFn elts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16592
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16593
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16594
fun isFixedFunction M n_elts = Option.isSome (peekFixedFunction M n_elts);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16595
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16596
fun peekFixedRelation M (n,elts) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16597
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16598
      val Metis_Model {fixedRelations = fixRels, ...} = M
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16599
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16600
      case Metis_NameArityMap.peek fixRels (n, length elts) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16601
        NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16602
      | SOME fixRel => fixRel elts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16603
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16604
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16605
fun isFixedRelation M n_elts = Option.isSome (peekFixedRelation M n_elts);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16606
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16607
(* A default model *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16608
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16609
val defaultSize = 8;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16610
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16611
val defaultFixed =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16612
    unionListFixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16613
      [basicFixed,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16614
       projectionFixed,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16615
       modularFixed,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16616
       setFixed,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16617
       listFixed];
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16618
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16619
val default = {size = defaultSize, fixed = defaultFixed};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16620
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16621
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16622
(* Taking apart terms to interpret them.                                     *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16623
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16624
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16625
fun destTerm tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16626
    case tm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16627
      Metis_Term.Var _ => tm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16628
    | Metis_Term.Fn f_tms =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16629
      case Metis_Term.stripApp tm of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16630
        (_,[]) => tm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16631
      | (v as Metis_Term.Var _, tms) => Metis_Term.Fn (Metis_Term.appName, v :: tms)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16632
      | (Metis_Term.Fn (f,tms), tms') => Metis_Term.Fn (f, tms @ tms');
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16633
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16634
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16635
(* Interpreting terms and formulas in the model.                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16636
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16637
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16638
fun interpretFunction M n_elts =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16639
    case peekFixedFunction M n_elts of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16640
      SOME r => r
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16641
    | NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16642
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16643
        val Metis_Model {randomFunctions = rndFns, ...} = M
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16644
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16645
        lookupTables rndFns n_elts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16646
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16647
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16648
fun interpretRelation M n_elts =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16649
    case peekFixedRelation M n_elts of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16650
      SOME r => r
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16651
    | NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16652
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16653
        val Metis_Model {randomRelations = rndRels, ...} = M
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16654
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16655
        intToBool (lookupTables rndRels n_elts)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16656
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16657
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16658
fun interpretTerm M V =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16659
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16660
      fun interpret tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16661
          case destTerm tm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16662
            Metis_Term.Var v => getValuation V v
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 16663
          | Metis_Term.Fn (f,tms) => interpretFunction M (f, List.map interpret tms)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16664
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16665
      interpret
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16666
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16667
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16668
fun interpretAtom M V (r,tms) =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 16669
    interpretRelation M (r, List.map (interpretTerm M V) tms);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16670
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16671
fun interpretFormula M =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16672
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16673
      val N = size M
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16674
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16675
      fun interpret V fm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16676
          case fm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16677
            Metis_Formula.True => true
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16678
          | Metis_Formula.False => false
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16679
          | Metis_Formula.Metis_Atom atm => interpretAtom M V atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16680
          | Metis_Formula.Not p => not (interpret V p)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16681
          | Metis_Formula.Or (p,q) => interpret V p orelse interpret V q
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16682
          | Metis_Formula.And (p,q) => interpret V p andalso interpret V q
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16683
          | Metis_Formula.Imp (p,q) => interpret V (Metis_Formula.Or (Metis_Formula.Not p, q))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16684
          | Metis_Formula.Iff (p,q) => interpret V p = interpret V q
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16685
          | Metis_Formula.Forall (v,p) => interpret' V p v N
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16686
          | Metis_Formula.Exists (v,p) =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16687
            interpret V (Metis_Formula.Not (Metis_Formula.Forall (v, Metis_Formula.Not p)))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16688
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16689
      and interpret' V fm v i =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16690
          i = 0 orelse
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16691
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16692
            val i = i - 1
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16693
            val V' = insertValuation V (v,i)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16694
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16695
            interpret V' fm andalso interpret' V fm v i
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16696
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16697
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16698
      interpret
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16699
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16700
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16701
fun interpretLiteral M V (pol,atm) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16702
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16703
      val b = interpretAtom M V atm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16704
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16705
      if pol then b else not b
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16706
    end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16707
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16708
fun interpretClause M V cl = Metis_LiteralSet.exists (interpretLiteral M V) cl;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16709
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16710
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16711
(* Check whether random groundings of a formula are true in the model.       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16712
(* Note: if it's cheaper, a systematic check will be performed instead.      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16713
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16714
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16715
fun check interpret {maxChecks} M fv x =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16716
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16717
      val N = size M
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16718
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16719
      fun score (V,{T,F}) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16720
          if interpret M V x then {T = T + 1, F = F} else {T = T, F = F + 1}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16721
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16722
      fun randomCheck acc = score (randomValuation {size = N} fv, acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16723
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16724
      val maxChecks =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16725
          case maxChecks of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16726
            NONE => maxChecks
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16727
          | SOME m =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16728
            case expInt N (Metis_NameSet.size fv) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16729
              SOME n => if n <= m then NONE else maxChecks
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16730
            | NONE => maxChecks
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16731
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16732
      case maxChecks of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16733
        SOME m => funpow m randomCheck {T = 0, F = 0}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16734
      | NONE => foldValuation {size = N} fv score {T = 0, F = 0}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16735
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16736
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16737
fun checkAtom maxChecks M atm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16738
    check interpretAtom maxChecks M (Metis_Atom.freeVars atm) atm;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16739
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16740
fun checkFormula maxChecks M fm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16741
    check interpretFormula maxChecks M (Metis_Formula.freeVars fm) fm;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16742
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16743
fun checkLiteral maxChecks M lit =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16744
    check interpretLiteral maxChecks M (Metis_Literal.freeVars lit) lit;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16745
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16746
fun checkClause maxChecks M cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16747
    check interpretClause maxChecks M (Metis_LiteralSet.freeVars cl) cl;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16748
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16749
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16750
(* Updating the model.                                                       *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16751
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16752
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16753
fun updateFunction M func_elts_elt =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16754
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16755
      val Metis_Model {randomFunctions = rndFns, ...} = M
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16756
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16757
      val () = updateTables rndFns func_elts_elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16758
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16759
      ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16760
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16761
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16762
fun updateRelation M (rel_elts,pol) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16763
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16764
      val Metis_Model {randomRelations = rndRels, ...} = M
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16765
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16766
      val () = updateTables rndRels (rel_elts, boolToInt pol)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16767
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16768
      ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16769
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16770
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16771
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16772
(* A type of terms with interpretations embedded in the subterms.            *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16773
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16774
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16775
datatype modelTerm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16776
    ModelVar
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16777
  | ModelFn of Metis_Term.functionName * modelTerm list * int list;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16778
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16779
fun modelTerm M V =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16780
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16781
      fun modelTm tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16782
          case destTerm tm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16783
            Metis_Term.Var v => (ModelVar, getValuation V v)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16784
          | Metis_Term.Fn (f,tms) =>
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16785
            let
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 16786
              val (tms,xs) = unzip (List.map modelTm tms)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16787
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16788
              (ModelFn (f,tms,xs), interpretFunction M (f,xs))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16789
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16790
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16791
      modelTm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16792
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16793
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16794
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16795
(* Perturbing the model.                                                     *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16796
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16797
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16798
datatype perturbation =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16799
    FunctionPerturbation of (Metis_Term.functionName * element list) * element
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16800
  | RelationPerturbation of (Metis_Atom.relationName * element list) * bool;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16801
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16802
fun perturb M pert =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16803
    case pert of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16804
      FunctionPerturbation func_elts_elt => updateFunction M func_elts_elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16805
    | RelationPerturbation rel_elts_pol => updateRelation M rel_elts_pol;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16806
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16807
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16808
  fun pertTerm _ [] _ acc = acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16809
    | pertTerm M target tm acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16810
      case tm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16811
        ModelVar => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16812
      | ModelFn (func,tms,xs) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16813
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16814
          fun onTarget ys = mem (interpretFunction M (func,ys)) target
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16815
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16816
          val func_xs = (func,xs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16817
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16818
          val acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16819
              if isFixedFunction M func_xs then acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16820
              else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16821
                let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16822
                  fun add (y,acc) = FunctionPerturbation (func_xs,y) :: acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16823
                in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 16824
                  List.foldl add acc target
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16825
                end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16826
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16827
          pertTerms M onTarget tms xs acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16828
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16829
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16830
  and pertTerms M onTarget =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16831
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16832
        val N = size M
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16833
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16834
        fun filterElements pred =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16835
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16836
              fun filt 0 acc = acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16837
                | filt i acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16838
                  let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16839
                    val i = i - 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16840
                    val acc = if pred i then i :: acc else acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16841
                  in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16842
                    filt i acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16843
                  end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16844
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16845
              filt N []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16846
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16847
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16848
        fun pert _ [] [] acc = acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16849
          | pert ys (tm :: tms) (x :: xs) acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16850
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16851
              fun pred y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16852
                  y <> x andalso onTarget (List.revAppend (ys, y :: xs))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16853
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16854
              val target = filterElements pred
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16855
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16856
              val acc = pertTerm M target tm acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16857
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16858
              pert (x :: ys) tms xs acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16859
            end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16860
          | pert _ _ _ _ = raise Bug "Metis_Model.pertTerms.pert"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16861
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16862
        pert []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16863
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16864
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16865
  fun pertAtom M V target (rel,tms) acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16866
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16867
        fun onTarget ys = interpretRelation M (rel,ys) = target
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16868
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 16869
        val (tms,xs) = unzip (List.map (modelTerm M V) tms)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16870
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16871
        val rel_xs = (rel,xs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16872
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16873
        val acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16874
            if isFixedRelation M rel_xs then acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16875
            else RelationPerturbation (rel_xs,target) :: acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16876
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16877
        pertTerms M onTarget tms xs acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16878
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16879
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16880
  fun pertLiteral M V ((pol,atm),acc) = pertAtom M V pol atm acc;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16881
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16882
  fun pertClause M V cl acc = Metis_LiteralSet.foldl (pertLiteral M V) acc cl;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16883
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16884
  fun pickPerturb M perts =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 16885
      if List.null perts then ()
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16886
      else perturb M (List.nth (perts, Metis_Portable.randomInt (length perts)));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16887
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16888
  fun perturbTerm M V (tm,target) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16889
      pickPerturb M (pertTerm M target (fst (modelTerm M V tm)) []);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16890
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16891
  fun perturbAtom M V (atm,target) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16892
      pickPerturb M (pertAtom M V target atm []);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16893
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16894
  fun perturbLiteral M V lit = pickPerturb M (pertLiteral M V (lit,[]));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16895
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16896
  fun perturbClause M V cl = pickPerturb M (pertClause M V cl []);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16897
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16898
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16899
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16900
(* Pretty printing.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16901
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16902
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16903
fun pp M =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16904
    Metis_Print.program
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 16905
      [Metis_Print.ppString "Metis_Model{",
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16906
       Metis_Print.ppInt (size M),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 16907
       Metis_Print.ppString "}"];
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 16908
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 16909
end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 16910
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 16911
(**** Original file: src/Problem.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16912
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16913
(* ========================================================================= *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16914
(* CNF PROBLEMS                                                              *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 16915
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16916
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16917
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16918
signature Metis_Problem =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16919
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16920
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16921
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16922
(* Problems.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16923
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16924
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16925
type problem =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16926
     {axioms : Metis_Thm.clause list,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16927
      conjecture : Metis_Thm.clause list}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16928
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16929
val size : problem -> {clauses : int,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16930
                       literals : int,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16931
                       symbols : int,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16932
                       typedSymbols : int}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16933
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16934
val freeVars : problem -> Metis_NameSet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16935
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16936
val toClauses : problem -> Metis_Thm.clause list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16937
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16938
val toFormula : problem -> Metis_Formula.formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16939
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16940
val toGoal : problem -> Metis_Formula.formula
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16941
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16942
val toString : problem -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16943
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16944
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16945
(* Categorizing problems.                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16946
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16947
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16948
datatype propositional =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16949
    Propositional
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16950
  | EffectivelyPropositional
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16951
  | NonPropositional
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16952
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16953
datatype equality =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16954
    NonEquality
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16955
  | Equality
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16956
  | PureEquality
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16957
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16958
datatype horn =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16959
    Trivial
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16960
  | Unit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16961
  | DoubleHorn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16962
  | Horn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16963
  | NegativeHorn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16964
  | NonHorn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16965
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16966
type category =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16967
     {propositional : propositional,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16968
      equality : equality,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16969
      horn : horn}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16970
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16971
val categorize : problem -> category
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16972
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16973
val categoryToString : category -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16974
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16975
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16976
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 16977
(**** Original file: src/Problem.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16978
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16979
(* ========================================================================= *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16980
(* CNF PROBLEMS                                                              *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 16981
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16982
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16983
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16984
structure Metis_Problem :> Metis_Problem =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16985
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16986
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16987
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16988
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16989
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16990
(* Problems.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16991
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16992
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16993
type problem =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16994
     {axioms : Metis_Thm.clause list,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16995
      conjecture : Metis_Thm.clause list};
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16996
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16997
fun toClauses {axioms,conjecture} = axioms @ conjecture;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16998
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16999
fun size prob =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17000
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17001
      fun lits (cl,n) = n + Metis_LiteralSet.size cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17002
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17003
      fun syms (cl,n) = n + Metis_LiteralSet.symbols cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17004
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17005
      fun typedSyms (cl,n) = n + Metis_LiteralSet.typedSymbols cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17006
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17007
      val cls = toClauses prob
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17008
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17009
      {clauses = length cls,
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17010
       literals = List.foldl lits 0 cls,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17011
       symbols = List.foldl syms 0 cls,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17012
       typedSymbols = List.foldl typedSyms 0 cls}
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17013
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17014
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17015
fun freeVars {axioms,conjecture} =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17016
    Metis_NameSet.union
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17017
      (Metis_LiteralSet.freeVarsList axioms)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17018
      (Metis_LiteralSet.freeVarsList conjecture);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17019
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17020
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17021
  fun clauseToFormula cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17022
      Metis_Formula.listMkDisj (Metis_LiteralSet.transform Metis_Literal.toFormula cl);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17023
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17024
  fun toFormula prob =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 17025
      Metis_Formula.listMkConj (List.map clauseToFormula (toClauses prob));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17026
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17027
  fun toGoal {axioms,conjecture} =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17028
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17029
        val clToFm = Metis_Formula.generalize o clauseToFormula
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 17030
        val clsToFm = Metis_Formula.listMkConj o List.map clToFm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17031
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17032
        val fm = Metis_Formula.False
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17033
        val fm =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 17034
            if List.null conjecture then fm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17035
            else Metis_Formula.Imp (clsToFm conjecture, fm)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17036
        val fm = Metis_Formula.Imp (clsToFm axioms, fm)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17037
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17038
        fm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17039
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17040
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17041
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17042
fun toString prob = Metis_Formula.toString (toFormula prob);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17043
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17044
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17045
(* Categorizing problems.                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17046
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17047
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17048
datatype propositional =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17049
    Propositional
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17050
  | EffectivelyPropositional
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17051
  | NonPropositional;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17052
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17053
datatype equality =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17054
    NonEquality
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17055
  | Equality
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17056
  | PureEquality;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17057
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17058
datatype horn =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17059
    Trivial
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17060
  | Unit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17061
  | DoubleHorn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17062
  | Horn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17063
  | NegativeHorn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17064
  | NonHorn;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17065
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17066
type category =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17067
     {propositional : propositional,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17068
      equality : equality,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17069
      horn : horn};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17070
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17071
fun categorize prob =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17072
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17073
      val cls = toClauses prob
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17074
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17075
      val rels =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17076
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17077
            fun f (cl,set) = Metis_NameAritySet.union set (Metis_LiteralSet.relations cl)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17078
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17079
            List.foldl f Metis_NameAritySet.empty cls
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17080
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17081
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17082
      val funs =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17083
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17084
            fun f (cl,set) = Metis_NameAritySet.union set (Metis_LiteralSet.functions cl)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17085
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17086
            List.foldl f Metis_NameAritySet.empty cls
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17087
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17088
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17089
      val propositional =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17090
          if Metis_NameAritySet.allNullary rels then Propositional
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17091
          else if Metis_NameAritySet.allNullary funs then EffectivelyPropositional
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17092
          else NonPropositional
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17093
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17094
      val equality =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17095
          if not (Metis_NameAritySet.member Metis_Atom.eqRelation rels) then NonEquality
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17096
          else if Metis_NameAritySet.size rels = 1 then PureEquality
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17097
          else Equality
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17098
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17099
      val horn =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17100
          if List.exists Metis_LiteralSet.null cls then Trivial
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17101
          else if List.all (fn cl => Metis_LiteralSet.size cl = 1) cls then Unit
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 17102
          else
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17103
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17104
              fun pos cl = Metis_LiteralSet.count Metis_Literal.positive cl <= 1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17105
              fun neg cl = Metis_LiteralSet.count Metis_Literal.negative cl <= 1
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17106
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17107
              case (List.all pos cls, List.all neg cls) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17108
                (true,true) => DoubleHorn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17109
              | (true,false) => Horn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17110
              | (false,true) => NegativeHorn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17111
              | (false,false) => NonHorn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17112
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17113
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17114
      {propositional = propositional,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17115
       equality = equality,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17116
       horn = horn}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17117
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17118
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17119
fun categoryToString {propositional,equality,horn} =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17120
    (case propositional of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17121
       Propositional => "propositional"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17122
     | EffectivelyPropositional => "effectively propositional"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17123
     | NonPropositional => "non-propositional") ^
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17124
    ", " ^
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17125
    (case equality of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17126
       NonEquality => "non-equality"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17127
     | Equality => "equality"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17128
     | PureEquality => "pure equality") ^
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17129
    ", " ^
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17130
    (case horn of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17131
       Trivial => "trivial"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17132
     | Unit => "unit"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17133
     | DoubleHorn => "horn (and negative horn)"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17134
     | Horn => "horn"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17135
     | NegativeHorn => "negative horn"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17136
     | NonHorn => "non-horn");
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17137
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17138
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17139
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17140
(**** Original file: src/TermNet.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17141
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17142
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17143
(* MATCHING AND UNIFICATION FOR SETS OF FIRST ORDER LOGIC TERMS              *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17144
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17145
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17146
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17147
signature Metis_TermNet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17148
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17149
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17150
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17151
(* A type of term sets that can be efficiently matched and unified.          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17152
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17153
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17154
type parameters = {fifo : bool}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17155
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17156
type 'a termNet
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17157
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17158
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17159
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17160
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17161
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17162
val new : parameters -> 'a termNet
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17163
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17164
val null : 'a termNet -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17165
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17166
val size : 'a termNet -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17167
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17168
val insert : 'a termNet -> Metis_Term.term * 'a -> 'a termNet
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17169
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17170
val fromList : parameters -> (Metis_Term.term * 'a) list -> 'a termNet
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17171
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17172
val filter : ('a -> bool) -> 'a termNet -> 'a termNet
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17173
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17174
val toString : 'a termNet -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17175
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17176
val pp : 'a Metis_Print.pp -> 'a termNet Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17177
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17178
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17179
(* Matching and unification queries.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17180
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17181
(* These function return OVER-APPROXIMATIONS!                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17182
(* Filter afterwards to get the precise set of satisfying values.            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17183
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17184
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17185
val match : 'a termNet -> Metis_Term.term -> 'a list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17186
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17187
val matched : 'a termNet -> Metis_Term.term -> 'a list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17188
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17189
val unify : 'a termNet -> Metis_Term.term -> 'a list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17190
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17191
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17192
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17193
(**** Original file: src/TermNet.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17194
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17195
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17196
(* MATCHING AND UNIFICATION FOR SETS OF FIRST ORDER LOGIC TERMS              *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17197
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17198
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17199
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17200
structure Metis_TermNet :> Metis_TermNet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17201
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17202
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17203
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17204
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17205
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17206
(* Anonymous variables.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17207
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17208
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17209
val anonymousName = Metis_Name.fromString "_";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17210
val anonymousVar = Metis_Term.Var anonymousName;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17211
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17212
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17213
(* Quotient terms.                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17214
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17215
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17216
datatype qterm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17217
    Var
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17218
  | Fn of Metis_NameArity.nameArity * qterm list;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17219
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17220
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17221
  fun cmp [] = EQUAL
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17222
    | cmp (q1_q2 :: qs) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17223
      if Metis_Portable.pointerEqual q1_q2 then cmp qs
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17224
      else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17225
        case q1_q2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17226
          (Var,Var) => EQUAL
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17227
        | (Var, Fn _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17228
        | (Fn _, Var) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17229
        | (Fn f1, Fn f2) => fnCmp f1 f2 qs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17230
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17231
  and fnCmp (n1,q1) (n2,q2) qs =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17232
    case Metis_NameArity.compare (n1,n2) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17233
      LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17234
    | EQUAL => cmp (zip q1 q2 @ qs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17235
    | GREATER => GREATER;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17236
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17237
  fun compareQterm q1_q2 = cmp [q1_q2];
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17238
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17239
  fun compareFnQterm (f1,f2) = fnCmp f1 f2 [];
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17240
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17241
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17242
fun equalQterm q1 q2 = compareQterm (q1,q2) = EQUAL;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17243
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17244
fun equalFnQterm f1 f2 = compareFnQterm (f1,f2) = EQUAL;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17245
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17246
fun termToQterm (Metis_Term.Var _) = Var
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 17247
  | termToQterm (Metis_Term.Fn (f,l)) = Fn ((f, length l), List.map termToQterm l);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17248
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17249
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17250
  fun qm [] = true
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17251
    | qm ((Var,_) :: rest) = qm rest
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17252
    | qm ((Fn _, Var) :: _) = false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17253
    | qm ((Fn (f,a), Fn (g,b)) :: rest) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17254
      Metis_NameArity.equal f g andalso qm (zip a b @ rest);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17255
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17256
  fun matchQtermQterm qtm qtm' = qm [(qtm,qtm')];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17257
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17258
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17259
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17260
  fun qm [] = true
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17261
    | qm ((Var,_) :: rest) = qm rest
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17262
    | qm ((Fn _, Metis_Term.Var _) :: _) = false
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17263
    | qm ((Fn ((f,n),a), Metis_Term.Fn (g,b)) :: rest) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17264
      Metis_Name.equal f g andalso n = length b andalso qm (zip a b @ rest);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17265
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17266
  fun matchQtermTerm qtm tm = qm [(qtm,tm)];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17267
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17268
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17269
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17270
  fun qn qsub [] = SOME qsub
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17271
    | qn qsub ((Metis_Term.Var v, qtm) :: rest) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17272
      (case Metis_NameMap.peek qsub v of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17273
         NONE => qn (Metis_NameMap.insert qsub (v,qtm)) rest
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17274
       | SOME qtm' => if equalQterm qtm qtm' then qn qsub rest else NONE)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17275
    | qn _ ((Metis_Term.Fn _, Var) :: _) = NONE
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17276
    | qn qsub ((Metis_Term.Fn (f,a), Fn ((g,n),b)) :: rest) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17277
      if Metis_Name.equal f g andalso length a = n then qn qsub (zip a b @ rest)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17278
      else NONE;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17279
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17280
  fun matchTermQterm qsub tm qtm = qn qsub [(tm,qtm)];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17281
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17282
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17283
local
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17284
  fun qv Var x = x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17285
    | qv x Var = x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17286
    | qv (Fn (f,a)) (Fn (g,b)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17287
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17288
        val _ = Metis_NameArity.equal f g orelse raise Error "Metis_TermNet.qv"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17289
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17290
        Fn (f, zipWith qv a b)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17291
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17292
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17293
  fun qu qsub [] = qsub
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17294
    | qu qsub ((Var, _) :: rest) = qu qsub rest
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17295
    | qu qsub ((qtm, Metis_Term.Var v) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17296
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17297
        val qtm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17298
            case Metis_NameMap.peek qsub v of NONE => qtm | SOME qtm' => qv qtm qtm'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17299
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17300
        qu (Metis_NameMap.insert qsub (v,qtm)) rest
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17301
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17302
    | qu qsub ((Fn ((f,n),a), Metis_Term.Fn (g,b)) :: rest) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17303
      if Metis_Name.equal f g andalso n = length b then qu qsub (zip a b @ rest)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17304
      else raise Error "Metis_TermNet.qu";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17305
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17306
  fun unifyQtermQterm qtm qtm' = total (qv qtm) qtm';
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17307
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17308
  fun unifyQtermTerm qsub qtm tm = total (qu qsub) [(qtm,tm)];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17309
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17310
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17311
local
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17312
  fun qtermToTerm Var = anonymousVar
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 17313
    | qtermToTerm (Fn ((f,_),l)) = Metis_Term.Fn (f, List.map qtermToTerm l);
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17314
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17315
  val ppQterm = Metis_Print.ppMap qtermToTerm Metis_Term.pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17316
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17317
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17318
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17319
(* A type of term sets that can be efficiently matched and unified.          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17320
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17321
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17322
type parameters = {fifo : bool};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17323
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17324
datatype 'a net =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17325
    Result of 'a list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17326
  | Single of qterm * 'a net
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17327
  | Multiple of 'a net option * 'a net Metis_NameArityMap.map;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17328
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17329
datatype 'a termNet = Net of parameters * int * (int * (int * 'a) net) option;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17330
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17331
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17332
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17333
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17334
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17335
fun new parm = Net (parm,0,NONE);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17336
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17337
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17338
  fun computeSize (Result l) = length l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17339
    | computeSize (Single (_,n)) = computeSize n
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17340
    | computeSize (Multiple (vs,fs)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17341
      Metis_NameArityMap.foldl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17342
        (fn (_,n,acc) => acc + computeSize n)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17343
        (case vs of SOME n => computeSize n | NONE => 0)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17344
        fs;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17345
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17346
  fun netSize NONE = NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17347
    | netSize (SOME n) = SOME (computeSize n, n);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17348
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17349
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17350
fun size (Net (_,_,NONE)) = 0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17351
  | size (Net (_, _, SOME (i,_))) = i;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17352
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17353
fun null net = size net = 0;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17354
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17355
fun singles qtms a = List.foldr Single a qtms;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17356
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17357
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17358
  fun pre NONE = (0,NONE)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17359
    | pre (SOME (i,n)) = (i, SOME n);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17360
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17361
  fun add (Result l) [] (Result l') = Result (l @ l')
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17362
    | add a (input1 as qtm :: qtms) (Single (qtm',n)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17363
      if equalQterm qtm qtm' then Single (qtm, add a qtms n)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17364
      else add a input1 (add n [qtm'] (Multiple (NONE, Metis_NameArityMap.new ())))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17365
    | add a (Var :: qtms) (Multiple (vs,fs)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17366
      Multiple (SOME (oadd a qtms vs), fs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17367
    | add a (Fn (f,l) :: qtms) (Multiple (vs,fs)) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17368
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17369
        val n = Metis_NameArityMap.peek fs f
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17370
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17371
        Multiple (vs, Metis_NameArityMap.insert fs (f, oadd a (l @ qtms) n))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17372
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17373
    | add _ _ _ = raise Bug "Metis_TermNet.insert: Match"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17374
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17375
  and oadd a qtms NONE = singles qtms a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17376
    | oadd a qtms (SOME n) = add a qtms n;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17377
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17378
  fun ins a qtm (i,n) = SOME (i + 1, oadd (Result [a]) [qtm] n);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17379
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17380
  fun insert (Net (p,k,n)) (tm,a) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17381
      Net (p, k + 1, ins (k,a) (termToQterm tm) (pre n))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17382
      handle Error _ => raise Bug "Metis_TermNet.insert: should never fail";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17383
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17384
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17385
fun fromList parm l = List.foldl (fn (tm_a,n) => insert n tm_a) (new parm) l;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17386
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17387
fun filter pred =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17388
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17389
      fun filt (Result l) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17390
          (case List.filter (fn (_,a) => pred a) l of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17391
             [] => NONE
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17392
           | l => SOME (Result l))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17393
        | filt (Single (qtm,n)) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17394
          (case filt n of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17395
             NONE => NONE
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17396
           | SOME n => SOME (Single (qtm,n)))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17397
        | filt (Multiple (vs,fs)) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17398
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17399
            val vs = Option.mapPartial filt vs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17400
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17401
            val fs = Metis_NameArityMap.mapPartial (fn (_,n) => filt n) fs
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17402
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17403
            if not (Option.isSome vs) andalso Metis_NameArityMap.null fs then NONE
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17404
            else SOME (Multiple (vs,fs))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17405
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17406
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17407
      fn net as Net (_,_,NONE) => net
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17408
       | Net (p, k, SOME (_,n)) => Net (p, k, netSize (filt n))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17409
    end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17410
    handle Error _ => raise Bug "Metis_TermNet.filter: should never fail";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17411
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17412
fun toString net = "Metis_TermNet[" ^ Int.toString (size net) ^ "]";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17413
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17414
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17415
(* Specialized fold operations to support matching and unification.          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17416
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17417
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17418
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17419
  fun norm (0 :: ks, (f as (_,n)) :: fs, qtms) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17420
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17421
        val (a,qtms) = revDivide qtms n
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17422
      in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17423
        addQterm (Fn (f,a)) (ks,fs,qtms)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17424
      end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17425
    | norm stack = stack
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17426
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17427
  and addQterm qtm (ks,fs,qtms) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17428
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17429
        val ks = case ks of [] => [] | k :: ks => (k - 1) :: ks
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17430
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17431
        norm (ks, fs, qtm :: qtms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17432
      end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17433
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17434
  and addFn (f as (_,n)) (ks,fs,qtms) = norm (n :: ks, f :: fs, qtms);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17435
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17436
  val stackEmpty = ([],[],[]);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17437
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17438
  val stackAddQterm = addQterm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17439
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17440
  val stackAddFn = addFn;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17441
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17442
  fun stackValue ([],[],[qtm]) = qtm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17443
    | stackValue _ = raise Bug "Metis_TermNet.stackValue";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17444
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17445
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17446
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17447
  fun fold _ acc [] = acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17448
    | fold inc acc ((0,stack,net) :: rest) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17449
      fold inc (inc (stackValue stack, net, acc)) rest
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17450
    | fold inc acc ((n, stack, Single (qtm,net)) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17451
      fold inc acc ((n - 1, stackAddQterm qtm stack, net) :: rest)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17452
    | fold inc acc ((n, stack, Multiple (v,fns)) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17453
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17454
        val n = n - 1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17455
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17456
        val rest =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17457
            case v of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17458
              NONE => rest
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17459
            | SOME net => (n, stackAddQterm Var stack, net) :: rest
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17460
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17461
        fun getFns (f as (_,k), net, x) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17462
            (k + n, stackAddFn f stack, net) :: x
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17463
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17464
        fold inc acc (Metis_NameArityMap.foldr getFns rest fns)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17465
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17466
    | fold _ _ _ = raise Bug "Metis_TermNet.foldTerms.fold";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17467
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17468
  fun foldTerms inc acc net = fold inc acc [(1,stackEmpty,net)];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17469
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17470
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17471
fun foldEqualTerms pat inc acc =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17472
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17473
      fun fold ([],net) = inc (pat,net,acc)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17474
        | fold (pat :: pats, Single (qtm,net)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17475
          if equalQterm pat qtm then fold (pats,net) else acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17476
        | fold (Var :: pats, Multiple (v,_)) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17477
          (case v of NONE => acc | SOME net => fold (pats,net))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17478
        | fold (Fn (f,a) :: pats, Multiple (_,fns)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17479
          (case Metis_NameArityMap.peek fns f of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17480
             NONE => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17481
           | SOME net => fold (a @ pats, net))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17482
        | fold _ = raise Bug "Metis_TermNet.foldEqualTerms.fold";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17483
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17484
      fn net => fold ([pat],net)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17485
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17486
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17487
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17488
  fun fold _ acc [] = acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17489
    | fold inc acc (([],stack,net) :: rest) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17490
      fold inc (inc (stackValue stack, net, acc)) rest
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17491
    | fold inc acc ((Var :: pats, stack, net) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17492
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17493
        fun harvest (qtm,n,l) = (pats, stackAddQterm qtm stack, n) :: l
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17494
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17495
        fold inc acc (foldTerms harvest rest net)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17496
      end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17497
    | fold inc acc ((pat :: pats, stack, Single (qtm,net)) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17498
      (case unifyQtermQterm pat qtm of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17499
         NONE => fold inc acc rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17500
       | SOME qtm =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17501
         fold inc acc ((pats, stackAddQterm qtm stack, net) :: rest))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17502
    | fold
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17503
        inc acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17504
        (((pat as Fn (f,a)) :: pats, stack, Multiple (v,fns)) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17505
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17506
        val rest =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17507
            case v of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17508
              NONE => rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17509
            | SOME net => (pats, stackAddQterm pat stack, net) :: rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17510
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17511
        val rest =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17512
            case Metis_NameArityMap.peek fns f of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17513
              NONE => rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17514
            | SOME net => (a @ pats, stackAddFn f stack, net) :: rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17515
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17516
        fold inc acc rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17517
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17518
    | fold _ _ _ = raise Bug "Metis_TermNet.foldUnifiableTerms.fold";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17519
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17520
  fun foldUnifiableTerms pat inc acc net =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17521
      fold inc acc [([pat],stackEmpty,net)];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17522
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17523
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17524
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17525
(* Matching and unification queries.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17526
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17527
(* These function return OVER-APPROXIMATIONS!                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17528
(* Filter afterwards to get the precise set of satisfying values.            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17529
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17530
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17531
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17532
  fun idwise ((m,_),(n,_)) = Int.compare (m,n);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17533
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17534
  fun fifoize ({fifo, ...} : parameters) l = if fifo then sort idwise l else l;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17535
in
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 17536
  fun finally parm l = List.map snd (fifoize parm l);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17537
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17538
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17539
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17540
  fun mat acc [] = acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17541
    | mat acc ((Result l, []) :: rest) = mat (l @ acc) rest
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17542
    | mat acc ((Single (qtm,n), tm :: tms) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17543
      mat acc (if matchQtermTerm qtm tm then (n,tms) :: rest else rest)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17544
    | mat acc ((Multiple (vs,fs), tm :: tms) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17545
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17546
        val rest = case vs of NONE => rest | SOME n => (n,tms) :: rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17547
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17548
        val rest =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17549
            case tm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17550
              Metis_Term.Var _ => rest
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17551
            | Metis_Term.Fn (f,l) =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17552
              case Metis_NameArityMap.peek fs (f, length l) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17553
                NONE => rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17554
              | SOME n => (n, l @ tms) :: rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17555
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17556
        mat acc rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17557
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17558
    | mat _ _ = raise Bug "Metis_TermNet.match: Match";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17559
in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17560
  fun match (Net (_,_,NONE)) _ = []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17561
    | match (Net (p, _, SOME (_,n))) tm =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17562
      finally p (mat [] [(n,[tm])])
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17563
      handle Error _ => raise Bug "Metis_TermNet.match: should never fail";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17564
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17565
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17566
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17567
  fun unseenInc qsub v tms (qtm,net,rest) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17568
      (Metis_NameMap.insert qsub (v,qtm), net, tms) :: rest;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17569
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17570
  fun seenInc qsub tms (_,net,rest) = (qsub,net,tms) :: rest;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17571
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17572
  fun mat acc [] = acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17573
    | mat acc ((_, Result l, []) :: rest) = mat (l @ acc) rest
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17574
    | mat acc ((qsub, Single (qtm,net), tm :: tms) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17575
      (case matchTermQterm qsub tm qtm of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17576
         NONE => mat acc rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17577
       | SOME qsub => mat acc ((qsub,net,tms) :: rest))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17578
    | mat acc ((qsub, net as Multiple _, Metis_Term.Var v :: tms) :: rest) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17579
      (case Metis_NameMap.peek qsub v of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17580
         NONE => mat acc (foldTerms (unseenInc qsub v tms) rest net)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17581
       | SOME qtm => mat acc (foldEqualTerms qtm (seenInc qsub tms) rest net))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17582
    | mat acc ((qsub, Multiple (_,fns), Metis_Term.Fn (f,a) :: tms) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17583
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17584
        val rest =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17585
            case Metis_NameArityMap.peek fns (f, length a) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17586
              NONE => rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17587
            | SOME net => (qsub, net, a @ tms) :: rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17588
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17589
        mat acc rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17590
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17591
    | mat _ _ = raise Bug "Metis_TermNet.matched.mat";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17592
in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17593
  fun matched (Net (_,_,NONE)) _ = []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17594
    | matched (Net (parm, _, SOME (_,net))) tm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17595
      finally parm (mat [] [(Metis_NameMap.new (), net, [tm])])
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17596
      handle Error _ => raise Bug "Metis_TermNet.matched: should never fail";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17597
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17598
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17599
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17600
  fun inc qsub v tms (qtm,net,rest) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17601
      (Metis_NameMap.insert qsub (v,qtm), net, tms) :: rest;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17602
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17603
  fun mat acc [] = acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17604
    | mat acc ((_, Result l, []) :: rest) = mat (l @ acc) rest
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17605
    | mat acc ((qsub, Single (qtm,net), tm :: tms) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17606
      (case unifyQtermTerm qsub qtm tm of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17607
         NONE => mat acc rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17608
       | SOME qsub => mat acc ((qsub,net,tms) :: rest))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17609
    | mat acc ((qsub, net as Multiple _, Metis_Term.Var v :: tms) :: rest) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17610
      (case Metis_NameMap.peek qsub v of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17611
         NONE => mat acc (foldTerms (inc qsub v tms) rest net)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17612
       | SOME qtm => mat acc (foldUnifiableTerms qtm (inc qsub v tms) rest net))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17613
    | mat acc ((qsub, Multiple (v,fns), Metis_Term.Fn (f,a) :: tms) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17614
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17615
        val rest = case v of NONE => rest | SOME net => (qsub,net,tms) :: rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17616
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17617
        val rest =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17618
            case Metis_NameArityMap.peek fns (f, length a) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17619
              NONE => rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17620
            | SOME net => (qsub, net, a @ tms) :: rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17621
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17622
        mat acc rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17623
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17624
    | mat _ _ = raise Bug "Metis_TermNet.unify.mat";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17625
in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17626
  fun unify (Net (_,_,NONE)) _ = []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17627
    | unify (Net (parm, _, SOME (_,net))) tm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17628
      finally parm (mat [] [(Metis_NameMap.new (), net, [tm])])
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17629
      handle Error _ => raise Bug "Metis_TermNet.unify: should never fail";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17630
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17631
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17632
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17633
(* Pretty printing.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17634
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17635
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17636
local
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17637
  fun inc (qtm, Result l, acc) =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17638
      List.foldl (fn ((n,a),acc) => (n,(qtm,a)) :: acc) acc l
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17639
    | inc _ = raise Bug "Metis_TermNet.pp.inc";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17640
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17641
  fun toList (Net (_,_,NONE)) = []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17642
    | toList (Net (parm, _, SOME (_,net))) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17643
      finally parm (foldTerms inc [] net);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17644
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17645
  fun pp ppA =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17646
      Metis_Print.ppMap toList (Metis_Print.ppList (Metis_Print.ppOp2 " |->" ppQterm ppA));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17647
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17648
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17649
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17650
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17651
(**** Original file: src/AtomNet.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17652
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17653
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17654
(* MATCHING AND UNIFICATION FOR SETS OF FIRST ORDER LOGIC ATOMS              *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17655
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17656
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17657
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17658
signature Metis_AtomNet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17659
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17660
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17661
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17662
(* A type of atom sets that can be efficiently matched and unified.          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17663
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17664
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17665
type parameters = {fifo : bool}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17666
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17667
type 'a atomNet
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17668
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17669
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17670
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17671
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17672
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17673
val new : parameters -> 'a atomNet
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17674
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17675
val size : 'a atomNet -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17676
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17677
val insert : 'a atomNet -> Metis_Atom.atom * 'a -> 'a atomNet
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17678
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17679
val fromList : parameters -> (Metis_Atom.atom * 'a) list -> 'a atomNet
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17680
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17681
val filter : ('a -> bool) -> 'a atomNet -> 'a atomNet
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17682
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17683
val toString : 'a atomNet -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17684
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17685
val pp : 'a Metis_Print.pp -> 'a atomNet Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17686
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17687
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17688
(* Matching and unification queries.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17689
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17690
(* These function return OVER-APPROXIMATIONS!                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17691
(* Filter afterwards to get the precise set of satisfying values.            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17692
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17693
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17694
val match : 'a atomNet -> Metis_Atom.atom -> 'a list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17695
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17696
val matched : 'a atomNet -> Metis_Atom.atom -> 'a list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17697
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17698
val unify : 'a atomNet -> Metis_Atom.atom -> 'a list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17699
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17700
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17701
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17702
(**** Original file: src/AtomNet.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17703
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17704
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17705
(* MATCHING AND UNIFICATION FOR SETS OF FIRST ORDER LOGIC ATOMS              *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17706
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17707
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17708
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17709
structure Metis_AtomNet :> Metis_AtomNet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17710
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17711
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17712
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17713
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17714
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17715
(* Helper functions.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17716
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17717
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17718
fun atomToTerm atom = Metis_Term.Fn atom;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17719
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17720
fun termToAtom (Metis_Term.Var _) = raise Bug "Metis_AtomNet.termToAtom"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17721
  | termToAtom (Metis_Term.Fn atom) = atom;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17722
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17723
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17724
(* A type of atom sets that can be efficiently matched and unified.          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17725
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17726
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17727
type parameters = Metis_TermNet.parameters;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17728
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17729
type 'a atomNet = 'a Metis_TermNet.termNet;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17730
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17731
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17732
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17733
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17734
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17735
val new = Metis_TermNet.new;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17736
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17737
val size = Metis_TermNet.size;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17738
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17739
fun insert net (atm,a) = Metis_TermNet.insert net (atomToTerm atm, a);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17740
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17741
fun fromList parm l = List.foldl (fn (atm_a,n) => insert n atm_a) (new parm) l;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17742
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17743
val filter = Metis_TermNet.filter;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17744
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17745
fun toString net = "Metis_AtomNet[" ^ Int.toString (size net) ^ "]";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17746
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17747
val pp = Metis_TermNet.pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17748
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17749
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17750
(* Matching and unification queries.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17751
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17752
(* These function return OVER-APPROXIMATIONS!                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17753
(* Filter afterwards to get the precise set of satisfying values.            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17754
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17755
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17756
fun match net atm = Metis_TermNet.match net (atomToTerm atm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17757
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17758
fun matched net atm = Metis_TermNet.matched net (atomToTerm atm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17759
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17760
fun unify net atm = Metis_TermNet.unify net (atomToTerm atm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17761
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17762
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17763
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17764
(**** Original file: src/LiteralNet.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17765
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17766
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17767
(* MATCHING AND UNIFICATION FOR SETS OF FIRST ORDER LOGIC LITERALS           *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17768
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17769
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17770
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17771
signature Metis_LiteralNet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17772
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17773
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17774
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17775
(* A type of literal sets that can be efficiently matched and unified.       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17776
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17777
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17778
type parameters = {fifo : bool}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17779
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17780
type 'a literalNet
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17781
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17782
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17783
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17784
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17785
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17786
val new : parameters -> 'a literalNet
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17787
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17788
val size : 'a literalNet -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17789
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17790
val profile : 'a literalNet -> {positive : int, negative : int}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17791
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17792
val insert : 'a literalNet -> Metis_Literal.literal * 'a -> 'a literalNet
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17793
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17794
val fromList : parameters -> (Metis_Literal.literal * 'a) list -> 'a literalNet
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17795
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17796
val filter : ('a -> bool) -> 'a literalNet -> 'a literalNet
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17797
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17798
val toString : 'a literalNet -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17799
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17800
val pp : 'a Metis_Print.pp -> 'a literalNet Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17801
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17802
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17803
(* Matching and unification queries.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17804
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17805
(* These function return OVER-APPROXIMATIONS!                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17806
(* Filter afterwards to get the precise set of satisfying values.            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17807
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17808
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17809
val match : 'a literalNet -> Metis_Literal.literal -> 'a list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17810
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17811
val matched : 'a literalNet -> Metis_Literal.literal -> 'a list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17812
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17813
val unify : 'a literalNet -> Metis_Literal.literal -> 'a list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17814
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17815
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17816
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17817
(**** Original file: src/LiteralNet.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17818
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17819
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17820
(* MATCHING AND UNIFICATION FOR SETS OF FIRST ORDER LOGIC LITERALS           *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17821
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17822
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17823
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17824
structure Metis_LiteralNet :> Metis_LiteralNet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17825
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17826
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17827
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17828
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17829
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17830
(* A type of literal sets that can be efficiently matched and unified.       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17831
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17832
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17833
type parameters = Metis_AtomNet.parameters;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17834
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17835
type 'a literalNet =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17836
    {positive : 'a Metis_AtomNet.atomNet,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17837
     negative : 'a Metis_AtomNet.atomNet};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17838
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17839
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17840
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17841
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17842
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17843
fun new parm = {positive = Metis_AtomNet.new parm, negative = Metis_AtomNet.new parm};
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17844
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17845
local
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17846
  fun pos ({positive,...} : 'a literalNet) = Metis_AtomNet.size positive;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17847
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17848
  fun neg ({negative,...} : 'a literalNet) = Metis_AtomNet.size negative;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17849
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17850
  fun size net = pos net + neg net;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17851
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17852
  fun profile net = {positive = pos net, negative = neg net};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17853
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17854
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17855
fun insert {positive,negative} ((true,atm),a) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17856
    {positive = Metis_AtomNet.insert positive (atm,a), negative = negative}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17857
  | insert {positive,negative} ((false,atm),a) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17858
    {positive = positive, negative = Metis_AtomNet.insert negative (atm,a)};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17859
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17860
fun fromList parm l = List.foldl (fn (lit_a,n) => insert n lit_a) (new parm) l;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17861
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17862
fun filter pred {positive,negative} =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17863
    {positive = Metis_AtomNet.filter pred positive,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17864
     negative = Metis_AtomNet.filter pred negative};
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17865
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17866
fun toString net = "Metis_LiteralNet[" ^ Int.toString (size net) ^ "]";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17867
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17868
fun pp ppA =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17869
    Metis_Print.ppMap
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17870
      (fn {positive,negative} => (positive,negative))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17871
      (Metis_Print.ppOp2 " + NEGATIVE" (Metis_AtomNet.pp ppA) (Metis_AtomNet.pp ppA));
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17872
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17873
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17874
(* Matching and unification queries.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17875
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17876
(* These function return OVER-APPROXIMATIONS!                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17877
(* Filter afterwards to get the precise set of satisfying values.            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17878
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17879
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17880
fun match ({positive,...} : 'a literalNet) (true,atm) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17881
    Metis_AtomNet.match positive atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17882
  | match {negative,...} (false,atm) = Metis_AtomNet.match negative atm;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17883
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17884
fun matched ({positive,...} : 'a literalNet) (true,atm) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17885
    Metis_AtomNet.matched positive atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17886
  | matched {negative,...} (false,atm) = Metis_AtomNet.matched negative atm;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17887
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17888
fun unify ({positive,...} : 'a literalNet) (true,atm) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17889
    Metis_AtomNet.unify positive atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17890
  | unify {negative,...} (false,atm) = Metis_AtomNet.unify negative atm;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17891
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17892
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17893
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17894
(**** Original file: src/Subsume.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17895
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17896
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17897
(* SUBSUMPTION CHECKING FOR FIRST ORDER LOGIC CLAUSES                        *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17898
(* Copyright (c) 2002 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17899
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17900
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17901
signature Metis_Subsume =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17902
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17903
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17904
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17905
(* A type of clause sets that supports efficient subsumption checking.       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17906
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17907
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17908
type 'a subsume
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17909
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17910
val new : unit -> 'a subsume
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17911
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17912
val size : 'a subsume -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17913
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17914
val insert : 'a subsume -> Metis_Thm.clause * 'a -> 'a subsume
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17915
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17916
val filter : ('a -> bool) -> 'a subsume -> 'a subsume
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17917
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17918
val pp : 'a subsume Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17919
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17920
val toString : 'a subsume -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17921
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17922
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17923
(* Subsumption checking.                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17924
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17925
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17926
val subsumes :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17927
    (Metis_Thm.clause * Metis_Subst.subst * 'a -> bool) -> 'a subsume -> Metis_Thm.clause ->
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17928
    (Metis_Thm.clause * Metis_Subst.subst * 'a) option
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17929
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17930
val isSubsumed : 'a subsume -> Metis_Thm.clause -> bool
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17931
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17932
val strictlySubsumes :  (* exclude subsuming clauses with more literals *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17933
    (Metis_Thm.clause * Metis_Subst.subst * 'a -> bool) -> 'a subsume -> Metis_Thm.clause ->
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17934
    (Metis_Thm.clause * Metis_Subst.subst * 'a) option
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17935
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17936
val isStrictlySubsumed : 'a subsume -> Metis_Thm.clause -> bool
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17937
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17938
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17939
(* Single clause versions.                                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17940
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17941
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17942
val clauseSubsumes : Metis_Thm.clause -> Metis_Thm.clause -> Metis_Subst.subst option
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17943
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17944
val clauseStrictlySubsumes : Metis_Thm.clause -> Metis_Thm.clause -> Metis_Subst.subst option
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17945
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17946
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17947
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17948
(**** Original file: src/Subsume.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17949
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17950
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17951
(* SUBSUMPTION CHECKING FOR FIRST ORDER LOGIC CLAUSES                        *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17952
(* Copyright (c) 2002 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17953
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17954
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17955
structure Metis_Subsume :> Metis_Subsume =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17956
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17957
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17958
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17959
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17960
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17961
(* Helper functions.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17962
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17963
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17964
fun findRest pred =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17965
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17966
      fun f _ [] = NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17967
        | f ys (x :: xs) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17968
          if pred x then SOME (x, List.revAppend (ys,xs)) else f (x :: ys) xs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17969
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17970
      f []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17971
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17972
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17973
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17974
  fun addSym (lit,acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17975
      case total Metis_Literal.sym lit of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17976
        NONE => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17977
      | SOME lit => lit :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17978
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17979
  fun clauseSym lits = List.foldl addSym lits lits;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17980
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17981
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17982
fun sortClause cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17983
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17984
      val lits = Metis_LiteralSet.toList cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17985
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17986
      sortMap Metis_Literal.typedSymbols (revCompare Int.compare) lits
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17987
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17988
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17989
fun incompatible lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17990
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17991
      val lits = clauseSym [lit]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17992
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17993
      fn lit' => not (List.exists (can (Metis_Literal.unify Metis_Subst.empty lit')) lits)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17994
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17995
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17996
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17997
(* Metis_Clause ids and lengths.                                                   *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17998
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17999
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18000
type clauseId = int;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18001
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18002
type clauseLength = int;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18003
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18004
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18005
  type idSet = (clauseId * clauseLength) Metis_Set.set;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18006
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18007
  fun idCompare ((id1,len1),(id2,len2)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18008
      case Int.compare (len1,len2) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18009
        LESS => LESS
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18010
      | EQUAL => Int.compare (id1,id2)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18011
      | GREATER => GREATER;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18012
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18013
  val idSetEmpty : idSet = Metis_Set.empty idCompare;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18014
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18015
  fun idSetAdd (id_len,set) : idSet = Metis_Set.add set id_len;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18016
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18017
  fun idSetAddMax max (id_len as (_,len), set) : idSet =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18018
      if len <= max then Metis_Set.add set id_len else set;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18019
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18020
  fun idSetIntersect set1 set2 : idSet = Metis_Set.intersect set1 set2;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18021
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18022
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18023
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18024
(* A type of clause sets that supports efficient subsumption checking.       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18025
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18026
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18027
datatype 'a subsume =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18028
    Metis_Subsume of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18029
      {empty : (Metis_Thm.clause * Metis_Subst.subst * 'a) list,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18030
       unit : (Metis_Literal.literal * Metis_Thm.clause * 'a)  Metis_LiteralNet.literalNet,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18031
       nonunit :
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18032
         {nextId : clauseId,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18033
          clauses : (Metis_Literal.literal list * Metis_Thm.clause * 'a) Metis_IntMap.map,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18034
          fstLits : (clauseId * clauseLength) Metis_LiteralNet.literalNet,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18035
          sndLits : (clauseId * clauseLength) Metis_LiteralNet.literalNet}};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18036
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18037
fun new () =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18038
    Metis_Subsume
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18039
      {empty = [],
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18040
       unit = Metis_LiteralNet.new {fifo = false},
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18041
       nonunit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18042
         {nextId = 0,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18043
          clauses = Metis_IntMap.new (),
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18044
          fstLits = Metis_LiteralNet.new {fifo = false},
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18045
          sndLits = Metis_LiteralNet.new {fifo = false}}};
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18046
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18047
fun size (Metis_Subsume {empty, unit, nonunit = {clauses,...}}) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18048
    length empty + Metis_LiteralNet.size unit + Metis_IntMap.size clauses;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18049
      
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18050
fun insert (Metis_Subsume {empty,unit,nonunit}) (cl',a) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18051
    case sortClause cl' of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18052
      [] =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18053
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18054
        val empty = (cl',Metis_Subst.empty,a) :: empty
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18055
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18056
        Metis_Subsume {empty = empty, unit = unit, nonunit = nonunit}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18057
      end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18058
    | [lit] =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18059
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18060
        val unit = Metis_LiteralNet.insert unit (lit,(lit,cl',a))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18061
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18062
        Metis_Subsume {empty = empty, unit = unit, nonunit = nonunit}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18063
      end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18064
    | fstLit :: (nonFstLits as sndLit :: otherLits) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18065
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18066
        val {nextId,clauses,fstLits,sndLits} = nonunit
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18067
        val id_length = (nextId, Metis_LiteralSet.size cl')
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18068
        val fstLits = Metis_LiteralNet.insert fstLits (fstLit,id_length)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18069
        val (sndLit,otherLits) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18070
            case findRest (incompatible fstLit) nonFstLits of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18071
              SOME sndLit_otherLits => sndLit_otherLits
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18072
            | NONE => (sndLit,otherLits)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18073
        val sndLits = Metis_LiteralNet.insert sndLits (sndLit,id_length)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18074
        val lits' = otherLits @ [fstLit,sndLit]
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18075
        val clauses = Metis_IntMap.insert clauses (nextId,(lits',cl',a))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18076
        val nextId = nextId + 1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18077
        val nonunit = {nextId = nextId, clauses = clauses,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18078
                       fstLits = fstLits, sndLits = sndLits}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18079
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18080
        Metis_Subsume {empty = empty, unit = unit, nonunit = nonunit}
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18081
      end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18082
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18083
fun filter pred (Metis_Subsume {empty,unit,nonunit}) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18084
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18085
      val empty = List.filter (pred o #3) empty
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18086
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18087
      val unit = Metis_LiteralNet.filter (pred o #3) unit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18088
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18089
      val nonunit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18090
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18091
            val {nextId,clauses,fstLits,sndLits} = nonunit
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18092
            val clauses' = Metis_IntMap.filter (pred o #3 o snd) clauses
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18093
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18094
            if Metis_IntMap.size clauses = Metis_IntMap.size clauses' then nonunit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18095
            else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18096
              let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18097
                fun predId (id,_) = Metis_IntMap.inDomain id clauses'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18098
                val fstLits = Metis_LiteralNet.filter predId fstLits
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18099
                and sndLits = Metis_LiteralNet.filter predId sndLits
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18100
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18101
                {nextId = nextId, clauses = clauses',
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18102
                 fstLits = fstLits, sndLits = sndLits}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18103
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18104
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18105
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18106
      Metis_Subsume {empty = empty, unit = unit, nonunit = nonunit}
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18107
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18108
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18109
fun toString subsume = "Metis_Subsume{" ^ Int.toString (size subsume) ^ "}";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18110
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18111
fun pp subsume = Metis_Print.ppMap toString Metis_Print.ppString subsume;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18112
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18113
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18114
(* Subsumption checking.                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18115
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18116
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18117
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18118
  fun matchLit lit' (lit,acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18119
      case total (Metis_Literal.match Metis_Subst.empty lit') lit of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18120
        SOME sub => sub :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18121
      | NONE => acc;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18122
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18123
  fun genClauseSubsumes pred cl' lits' cl a =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18124
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18125
        fun mkSubsl acc sub [] = SOME (sub, sortMap length Int.compare acc)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18126
          | mkSubsl acc sub (lit' :: lits') =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18127
            case List.foldl (matchLit lit') [] cl of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18128
              [] => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18129
            | [sub'] =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18130
              (case total (Metis_Subst.union sub) sub' of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18131
                 NONE => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18132
               | SOME sub => mkSubsl acc sub lits')
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18133
            | subs => mkSubsl (subs :: acc) sub lits'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18134
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18135
        fun search [] = NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18136
          | search ((sub,[]) :: others) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18137
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18138
              val x = (cl',sub,a)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18139
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18140
              if pred x then SOME x else search others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18141
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18142
          | search ((_, [] :: _) :: others) = search others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18143
          | search ((sub, (sub' :: subs) :: subsl) :: others) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18144
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18145
              val others = (sub, subs :: subsl) :: others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18146
            in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18147
              case total (Metis_Subst.union sub) sub' of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18148
                NONE => search others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18149
              | SOME sub => search ((sub,subsl) :: others)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18150
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18151
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18152
        case mkSubsl [] Metis_Subst.empty lits' of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18153
          NONE => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18154
        | SOME sub_subsl => search [sub_subsl]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18155
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18156
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18157
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18158
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18159
  fun emptySubsumes pred empty = List.find pred empty;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18160
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18161
  fun unitSubsumes pred unit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18162
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18163
        fun subLit lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18164
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18165
              fun subUnit (lit',cl',a) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18166
                  case total (Metis_Literal.match Metis_Subst.empty lit') lit of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18167
                    NONE => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18168
                  | SOME sub =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18169
                    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18170
                      val x = (cl',sub,a)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18171
                    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18172
                      if pred x then SOME x else NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18173
                    end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18174
            in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18175
              first subUnit (Metis_LiteralNet.match unit lit)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18176
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18177
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18178
        first subLit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18179
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18180
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18181
  fun nonunitSubsumes pred nonunit max cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18182
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18183
        val addId = case max of NONE => idSetAdd | SOME n => idSetAddMax n
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18184
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18185
        fun subLit lits (lit,acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18186
            List.foldl addId acc (Metis_LiteralNet.match lits lit)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18187
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18188
        val {nextId = _, clauses, fstLits, sndLits} = nonunit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18189
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18190
        fun subCl' (id,_) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18191
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18192
              val (lits',cl',a) = Metis_IntMap.get clauses id
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18193
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18194
              genClauseSubsumes pred cl' lits' cl a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18195
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18196
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18197
        val fstCands = List.foldl (subLit fstLits) idSetEmpty cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18198
        val sndCands = List.foldl (subLit sndLits) idSetEmpty cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18199
        val cands = idSetIntersect fstCands sndCands
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18200
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18201
        Metis_Set.firstl subCl' cands
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18202
      end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18203
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18204
  fun genSubsumes pred (Metis_Subsume {empty,unit,nonunit}) max cl =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18205
      case emptySubsumes pred empty of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18206
        s as SOME _ => s
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18207
      | NONE =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18208
        if max = SOME 0 then NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18209
        else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18210
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18211
            val cl = clauseSym (Metis_LiteralSet.toList cl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18212
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18213
            case unitSubsumes pred unit cl of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18214
              s as SOME _ => s
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18215
            | NONE =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18216
              if max = SOME 1 then NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18217
              else nonunitSubsumes pred nonunit max cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18218
          end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18219
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18220
  fun subsumes pred subsume cl = genSubsumes pred subsume NONE cl;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18221
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18222
  fun strictlySubsumes pred subsume cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18223
      genSubsumes pred subsume (SOME (Metis_LiteralSet.size cl)) cl;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18224
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18225
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18226
(*MetisTrace4
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18227
val subsumes = fn pred => fn subsume => fn cl =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18228
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18229
      val ppCl = Metis_LiteralSet.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18230
      val ppSub = Metis_Subst.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18231
      val () = Metis_Print.trace ppCl "Metis_Subsume.subsumes: cl" cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18232
      val result = subsumes pred subsume cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18233
      val () =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18234
          case result of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18235
            NONE => trace "Metis_Subsume.subsumes: not subsumed\n"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18236
          | SOME (cl,sub,_) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18237
            (Metis_Print.trace ppCl "Metis_Subsume.subsumes: subsuming cl" cl;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18238
             Metis_Print.trace ppSub "Metis_Subsume.subsumes: subsuming sub" sub)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18239
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18240
      result
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18241
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18242
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18243
val strictlySubsumes = fn pred => fn subsume => fn cl =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18244
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18245
      val ppCl = Metis_LiteralSet.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18246
      val ppSub = Metis_Subst.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18247
      val () = Metis_Print.trace ppCl "Metis_Subsume.strictlySubsumes: cl" cl
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 18248
      val result = strictlySubsumes pred subsume cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18249
      val () =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18250
          case result of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18251
            NONE => trace "Metis_Subsume.subsumes: not subsumed\n"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18252
          | SOME (cl,sub,_) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18253
            (Metis_Print.trace ppCl "Metis_Subsume.subsumes: subsuming cl" cl;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18254
             Metis_Print.trace ppSub "Metis_Subsume.subsumes: subsuming sub" sub)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18255
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18256
      result
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18257
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18258
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18259
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18260
fun isSubsumed subs cl = Option.isSome (subsumes (K true) subs cl);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18261
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18262
fun isStrictlySubsumed subs cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18263
    Option.isSome (strictlySubsumes (K true) subs cl);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18264
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18265
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18266
(* Single clause versions.                                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18267
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18268
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18269
fun clauseSubsumes cl' cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18270
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18271
      val lits' = sortClause cl'
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18272
      and lits = clauseSym (Metis_LiteralSet.toList cl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18273
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18274
      case genClauseSubsumes (K true) cl' lits' lits () of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18275
        SOME (_,sub,()) => SOME sub
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18276
      | NONE => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18277
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18278
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18279
fun clauseStrictlySubsumes cl' cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18280
    if Metis_LiteralSet.size cl' > Metis_LiteralSet.size cl then NONE
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18281
    else clauseSubsumes cl' cl;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18282
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18283
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18284
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18285
(**** Original file: src/KnuthBendixOrder.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18286
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18287
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18288
(* THE KNUTH-BENDIX TERM ORDERING                                            *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18289
(* Copyright (c) 2002 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18290
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18291
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18292
signature Metis_KnuthBendixOrder =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18293
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18294
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18295
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18296
(* The weight of all constants must be at least 1, and there must be at most *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18297
(* one unary function with weight 0.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18298
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18299
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18300
type kbo =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18301
     {weight : Metis_Term.function -> int,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18302
      precedence : Metis_Term.function * Metis_Term.function -> order}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18303
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18304
val default : kbo
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18305
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18306
val compare : kbo -> Metis_Term.term * Metis_Term.term -> order option
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18307
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18308
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18309
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18310
(**** Original file: src/KnuthBendixOrder.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18311
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18312
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18313
(* KNUTH-BENDIX TERM ORDERING CONSTRAINTS                                    *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18314
(* Copyright (c) 2002 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18315
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18316
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18317
structure Metis_KnuthBendixOrder :> Metis_KnuthBendixOrder =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18318
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18319
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18320
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18321
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18322
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18323
(* Helper functions.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18324
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18325
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18326
fun notEqualTerm (x,y) = not (Metis_Term.equal x y);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18327
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18328
fun firstNotEqualTerm f l =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18329
    case List.find notEqualTerm l of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18330
      SOME (x,y) => f x y
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18331
    | NONE => raise Bug "firstNotEqualTerm";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18332
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18333
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18334
(* The weight of all constants must be at least 1, and there must be at most *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18335
(* one unary function with weight 0.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18336
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18337
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18338
type kbo =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18339
     {weight : Metis_Term.function -> int,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18340
      precedence : Metis_Term.function * Metis_Term.function -> order};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18341
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18342
(* Default weight = uniform *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18343
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18344
val uniformWeight : Metis_Term.function -> int = K 1;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18345
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18346
(* Default precedence = by arity *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18347
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18348
val arityPrecedence : Metis_Term.function * Metis_Term.function -> order =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18349
    fn ((f1,n1),(f2,n2)) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18350
       case Int.compare (n1,n2) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18351
         LESS => LESS
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18352
       | EQUAL => Metis_Name.compare (f1,f2)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18353
       | GREATER => GREATER;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18354
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18355
(* The default order *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18356
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18357
val default = {weight = uniformWeight, precedence = arityPrecedence};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18358
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18359
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18360
(* Metis_Term weight-1 represented as a linear function of the weight-1 of the     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18361
(* variables in the term (plus a constant).                                  *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18362
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18363
(* Note that the conditions on weight functions ensure that all weights are  *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18364
(* at least 1, so all weight-1s are at least 0.                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18365
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18366
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18367
datatype weight = Weight of int Metis_NameMap.map * int;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18368
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18369
val weightEmpty : int Metis_NameMap.map = Metis_NameMap.new ();
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18370
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18371
val weightZero = Weight (weightEmpty,0);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18372
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18373
fun weightIsZero (Weight (m,c)) = c = 0 andalso Metis_NameMap.null m;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18374
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18375
fun weightNeg (Weight (m,c)) = Weight (Metis_NameMap.transform ~ m, ~c);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18376
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18377
local
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18378
  fun add ((_,n1),(_,n2)) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18379
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18380
        val n = n1 + n2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18381
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18382
        if n = 0 then NONE else SOME n
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18383
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18384
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18385
  fun weightAdd (Weight (m1,c1)) (Weight (m2,c2)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18386
      Weight (Metis_NameMap.union add m1 m2, c1 + c2);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18387
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18388
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18389
fun weightSubtract w1 w2 = weightAdd w1 (weightNeg w2);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18390
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18391
fun weightTerm weight =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18392
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18393
      fun wt m c [] = Weight (m,c)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18394
        | wt m c (Metis_Term.Var v :: tms) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18395
          let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18396
            val n = Option.getOpt (Metis_NameMap.peek m v, 0)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18397
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18398
            wt (Metis_NameMap.insert m (v, n + 1)) (c + 1) tms
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18399
          end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18400
        | wt m c (Metis_Term.Fn (f,a) :: tms) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18401
          wt m (c + weight (f, length a)) (a @ tms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18402
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18403
      fn tm => wt weightEmpty ~1 [tm]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18404
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18405
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18406
fun weightLowerBound (w as Weight (m,c)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18407
    if Metis_NameMap.exists (fn (_,n) => n < 0) m then NONE else SOME c;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18408
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18409
(*MetisDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18410
val ppWeightList =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18411
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18412
      fun ppCoeff n =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18413
          if n < 0 then Metis_Print.sequence (Metis_Print.ppString "~") (ppCoeff (~n))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18414
          else if n = 1 then Metis_Print.skip
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18415
          else Metis_Print.ppInt n
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18416
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18417
      fun pp_tm (NONE,n) = Metis_Print.ppInt n
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18418
        | pp_tm (SOME v, n) = Metis_Print.sequence (ppCoeff n) (Metis_Name.pp v)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18419
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18420
      fn [] => Metis_Print.ppInt 0
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18421
       | tms => Metis_Print.ppOpList " +" pp_tm tms
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18422
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18423
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18424
fun ppWeight (Weight (m,c)) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18425
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18426
      val l = Metis_NameMap.toList m
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18427
      val l = List.map (fn (v,n) => (SOME v, n)) l
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18428
      val l = if c = 0 then l else l @ [(NONE,c)]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18429
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18430
      ppWeightList l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18431
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18432
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18433
val weightToString = Metis_Print.toString ppWeight;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18434
*)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18435
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18436
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18437
(* The Knuth-Bendix term order.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18438
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18439
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18440
fun compare {weight,precedence} =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18441
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18442
      fun weightDifference tm1 tm2 =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18443
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18444
            val w1 = weightTerm weight tm1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18445
            and w2 = weightTerm weight tm2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18446
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18447
            weightSubtract w2 w1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18448
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18449
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18450
      fun weightLess tm1 tm2 =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18451
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18452
            val w = weightDifference tm1 tm2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18453
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18454
            if weightIsZero w then precedenceLess tm1 tm2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18455
            else weightDiffLess w tm1 tm2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18456
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18457
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18458
      and weightDiffLess w tm1 tm2 =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18459
          case weightLowerBound w of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18460
            NONE => false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18461
          | SOME 0 => precedenceLess tm1 tm2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18462
          | SOME n => n > 0
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18463
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18464
      and precedenceLess (Metis_Term.Fn (f1,a1)) (Metis_Term.Fn (f2,a2)) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18465
          (case precedence ((f1, length a1), (f2, length a2)) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18466
             LESS => true
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18467
           | EQUAL => firstNotEqualTerm weightLess (zip a1 a2)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18468
           | GREATER => false)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18469
        | precedenceLess _ _ = false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18470
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18471
      fun weightDiffGreater w tm1 tm2 = weightDiffLess (weightNeg w) tm2 tm1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18472
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18473
      fun weightCmp tm1 tm2 =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18474
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18475
            val w = weightDifference tm1 tm2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18476
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18477
            if weightIsZero w then precedenceCmp tm1 tm2
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18478
            else if weightDiffLess w tm1 tm2 then SOME LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18479
            else if weightDiffGreater w tm1 tm2 then SOME GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18480
            else NONE
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18481
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18482
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18483
      and precedenceCmp (Metis_Term.Fn (f1,a1)) (Metis_Term.Fn (f2,a2)) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18484
          (case precedence ((f1, length a1), (f2, length a2)) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18485
             LESS => SOME LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18486
           | EQUAL => firstNotEqualTerm weightCmp (zip a1 a2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18487
           | GREATER => SOME GREATER)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18488
        | precedenceCmp _ _ = raise Bug "kboOrder.precendenceCmp"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18489
    in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18490
      fn (tm1,tm2) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18491
         if Metis_Term.equal tm1 tm2 then SOME EQUAL else weightCmp tm1 tm2
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18492
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18493
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18494
(*MetisTrace7
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18495
val compare = fn kbo => fn (tm1,tm2) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18496
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18497
      val () = Metis_Print.trace Metis_Term.pp "Metis_KnuthBendixOrder.compare: tm1" tm1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18498
      val () = Metis_Print.trace Metis_Term.pp "Metis_KnuthBendixOrder.compare: tm2" tm2
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18499
      val result = compare kbo (tm1,tm2)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18500
      val () =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18501
          case result of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18502
            NONE => trace "Metis_KnuthBendixOrder.compare: result = Incomparable\n"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18503
          | SOME x =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18504
            Metis_Print.trace Metis_Print.ppOrder "Metis_KnuthBendixOrder.compare: result" x
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18505
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18506
      result
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18507
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18508
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18509
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18510
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18511
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18512
(**** Original file: src/Rewrite.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18513
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18514
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18515
(* ORDERED REWRITING FOR FIRST ORDER TERMS                                   *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18516
(* Copyright (c) 2003 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18517
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18518
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18519
signature Metis_Rewrite =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18520
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18521
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18522
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18523
(* Orientations of equations.                                                *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18524
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18525
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18526
datatype orient = LeftToRight | RightToLeft
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18527
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18528
val toStringOrient : orient -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18529
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18530
val ppOrient : orient Metis_Print.pp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18531
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18532
val toStringOrientOption : orient option -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18533
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18534
val ppOrientOption : orient option Metis_Print.pp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18535
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18536
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18537
(* A type of rewrite systems.                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18538
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18539
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18540
type reductionOrder = Metis_Term.term * Metis_Term.term -> order option
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18541
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18542
type equationId = int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18543
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18544
type equation = Metis_Rule.equation
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18545
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18546
type rewrite
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18547
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18548
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18549
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18550
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18551
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18552
val new : reductionOrder -> rewrite
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18553
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18554
val peek : rewrite -> equationId -> (equation * orient option) option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18555
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18556
val size : rewrite -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18557
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18558
val equations : rewrite -> equation list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18559
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18560
val toString : rewrite -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18561
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18562
val pp : rewrite Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18563
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18564
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18565
(* Add equations into the system.                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18566
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18567
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18568
val add : rewrite -> equationId * equation -> rewrite
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18569
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18570
val addList : rewrite -> (equationId * equation) list -> rewrite
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18571
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18572
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18573
(* Rewriting (the order must be a refinement of the rewrite order).          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18574
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18575
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18576
val rewrConv : rewrite -> reductionOrder -> Metis_Rule.conv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18577
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18578
val rewriteConv : rewrite -> reductionOrder -> Metis_Rule.conv
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18579
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18580
val rewriteLiteralsRule :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18581
    rewrite -> reductionOrder -> Metis_LiteralSet.set -> Metis_Rule.rule
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18582
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18583
val rewriteRule : rewrite -> reductionOrder -> Metis_Rule.rule
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18584
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18585
val rewrIdConv : rewrite -> reductionOrder -> equationId -> Metis_Rule.conv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18586
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18587
val rewriteIdConv : rewrite -> reductionOrder -> equationId -> Metis_Rule.conv
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18588
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18589
val rewriteIdLiteralsRule :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18590
    rewrite -> reductionOrder -> equationId -> Metis_LiteralSet.set -> Metis_Rule.rule
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18591
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18592
val rewriteIdRule : rewrite -> reductionOrder -> equationId -> Metis_Rule.rule
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18593
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18594
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18595
(* Inter-reduce the equations in the system.                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18596
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18597
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18598
val reduce' : rewrite -> rewrite * equationId list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18599
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18600
val reduce : rewrite -> rewrite
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18601
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18602
val isReduced : rewrite -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18603
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18604
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18605
(* Rewriting as a derived rule.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18606
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18607
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18608
val rewrite : equation list -> Metis_Thm.thm -> Metis_Thm.thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18609
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18610
val orderedRewrite : reductionOrder -> equation list -> Metis_Thm.thm -> Metis_Thm.thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18611
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18612
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18613
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18614
(**** Original file: src/Rewrite.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18615
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18616
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18617
(* ORDERED REWRITING FOR FIRST ORDER TERMS                                   *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18618
(* Copyright (c) 2003 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18619
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18620
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18621
structure Metis_Rewrite :> Metis_Rewrite =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18622
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18623
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18624
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18625
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18626
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18627
(* Orientations of equations.                                                *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18628
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18629
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18630
datatype orient = LeftToRight | RightToLeft;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18631
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18632
fun toStringOrient ort =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18633
    case ort of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18634
      LeftToRight => "-->"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18635
    | RightToLeft => "<--";
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18636
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18637
val ppOrient = Metis_Print.ppMap toStringOrient Metis_Print.ppString;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18638
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18639
fun toStringOrientOption orto =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18640
    case orto of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18641
      SOME ort => toStringOrient ort
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18642
    | NONE => "<->";
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18643
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18644
val ppOrientOption = Metis_Print.ppMap toStringOrientOption Metis_Print.ppString;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18645
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18646
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18647
(* A type of rewrite systems.                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18648
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18649
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18650
type reductionOrder = Metis_Term.term * Metis_Term.term -> order option;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18651
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18652
type equationId = int;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18653
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18654
type equation = Metis_Rule.equation;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18655
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18656
datatype rewrite =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18657
    Metis_Rewrite of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18658
      {order : reductionOrder,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18659
       known : (equation * orient option) Metis_IntMap.map,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18660
       redexes : (equationId * orient) Metis_TermNet.termNet,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18661
       subterms : (equationId * bool * Metis_Term.path) Metis_TermNet.termNet,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18662
       waiting : Metis_IntSet.set};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18663
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18664
fun updateWaiting rw waiting =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18665
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18666
      val Metis_Rewrite {order, known, redexes, subterms, waiting = _} = rw
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18667
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18668
      Metis_Rewrite
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18669
        {order = order, known = known, redexes = redexes,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18670
         subterms = subterms, waiting = waiting}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18671
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18672
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18673
fun deleteWaiting (rw as Metis_Rewrite {waiting,...}) id =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18674
    updateWaiting rw (Metis_IntSet.delete waiting id);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18675
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18676
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18677
(* Basic operations                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18678
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18679
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18680
fun new order =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18681
    Metis_Rewrite
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18682
      {order = order,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18683
       known = Metis_IntMap.new (),
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18684
       redexes = Metis_TermNet.new {fifo = false},
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18685
       subterms = Metis_TermNet.new {fifo = false},
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18686
       waiting = Metis_IntSet.empty};
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18687
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18688
fun peek (Metis_Rewrite {known,...}) id = Metis_IntMap.peek known id;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18689
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18690
fun size (Metis_Rewrite {known,...}) = Metis_IntMap.size known;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18691
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18692
fun equations (Metis_Rewrite {known,...}) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18693
    Metis_IntMap.foldr (fn (_,(eqn,_),eqns) => eqn :: eqns) [] known;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18694
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18695
val pp = Metis_Print.ppMap equations (Metis_Print.ppList Metis_Rule.ppEquation);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18696
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18697
(*MetisTrace1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18698
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18699
  fun ppEq ((x_y,_),ort) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18700
      Metis_Print.ppOp2 (" " ^ toStringOrientOption ort) Metis_Term.pp Metis_Term.pp x_y;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18701
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18702
  fun ppField f ppA a =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 18703
      Metis_Print.inconsistentBlock 2
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18704
        [Metis_Print.ppString (f ^ " ="),
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 18705
         Metis_Print.break,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18706
         ppA a];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18707
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18708
  val ppKnown =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18709
      ppField "known"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18710
        (Metis_Print.ppMap Metis_IntMap.toList
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18711
           (Metis_Print.ppList (Metis_Print.ppPair Metis_Print.ppInt ppEq)));
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18712
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18713
  val ppRedexes =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18714
      ppField "redexes"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18715
        (Metis_TermNet.pp (Metis_Print.ppPair Metis_Print.ppInt ppOrient));
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18716
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18717
  val ppSubterms =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18718
      ppField "subterms"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18719
        (Metis_TermNet.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18720
           (Metis_Print.ppMap
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18721
              (fn (i,l,p) => (i, (if l then 0 else 1) :: p))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18722
              (Metis_Print.ppPair Metis_Print.ppInt Metis_Term.ppPath)));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18723
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18724
  val ppWaiting =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18725
      ppField "waiting"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18726
        (Metis_Print.ppMap (Metis_IntSet.toList) (Metis_Print.ppList Metis_Print.ppInt));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18727
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18728
  fun pp (Metis_Rewrite {known,redexes,subterms,waiting,...}) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 18729
      Metis_Print.inconsistentBlock 2
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18730
        [Metis_Print.ppString "Metis_Rewrite",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 18731
         Metis_Print.break,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 18732
         Metis_Print.inconsistentBlock 1
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18733
           [Metis_Print.ppString "{",
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18734
            ppKnown known,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18735
(*MetisTrace5
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18736
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 18737
            Metis_Print.break,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18738
            ppRedexes redexes,
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18739
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 18740
            Metis_Print.break,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18741
            ppSubterms subterms,
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18742
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 18743
            Metis_Print.break,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18744
            ppWaiting waiting,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18745
*)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18746
            Metis_Print.skip],
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18747
         Metis_Print.ppString "}"]
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18748
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18749
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18750
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18751
val toString = Metis_Print.toString pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18752
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18753
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18754
(* Debug functions.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18755
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18756
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18757
fun termReducible order known id =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18758
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18759
      fun eqnRed ((l,r),_) tm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18760
          case total (Metis_Subst.match Metis_Subst.empty l) tm of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18761
            NONE => false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18762
          | SOME sub =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18763
            order (tm, Metis_Subst.subst (Metis_Subst.normalize sub) r) = SOME GREATER
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18764
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18765
      fun knownRed tm (eqnId,(eqn,ort)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18766
          eqnId <> id andalso
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18767
          ((ort <> SOME RightToLeft andalso eqnRed eqn tm) orelse
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18768
           (ort <> SOME LeftToRight andalso eqnRed (Metis_Rule.symEqn eqn) tm))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18769
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18770
      fun termRed tm = Metis_IntMap.exists (knownRed tm) known orelse subtermRed tm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18771
      and subtermRed (Metis_Term.Var _) = false
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18772
        | subtermRed (Metis_Term.Fn (_,tms)) = List.exists termRed tms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18773
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18774
      termRed
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18775
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18776
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18777
fun literalReducible order known id lit =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18778
    List.exists (termReducible order known id) (Metis_Literal.arguments lit);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18779
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18780
fun literalsReducible order known id lits =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18781
    Metis_LiteralSet.exists (literalReducible order known id) lits;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18782
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18783
fun thmReducible order known id th =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18784
    literalsReducible order known id (Metis_Thm.clause th);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18785
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18786
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18787
(* Add equations into the system.                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18788
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18789
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18790
fun orderToOrient (SOME EQUAL) = raise Error "Metis_Rewrite.orient: reflexive"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18791
  | orderToOrient (SOME GREATER) = SOME LeftToRight
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18792
  | orderToOrient (SOME LESS) = SOME RightToLeft
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18793
  | orderToOrient NONE = NONE;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18794
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18795
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18796
  fun ins redexes redex id ort = Metis_TermNet.insert redexes (redex,(id,ort));
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18797
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18798
  fun addRedexes id (((l,r),_),ort) redexes =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18799
      case ort of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18800
        SOME LeftToRight => ins redexes l id LeftToRight
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18801
      | SOME RightToLeft => ins redexes r id RightToLeft
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18802
      | NONE => ins (ins redexes l id LeftToRight) r id RightToLeft;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18803
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18804
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18805
fun add (rw as Metis_Rewrite {known,...}) (id,eqn) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18806
    if Metis_IntMap.inDomain id known then rw
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18807
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18808
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18809
        val Metis_Rewrite {order,redexes,subterms,waiting, ...} = rw
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18810
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18811
        val ort = orderToOrient (order (fst eqn))
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18812
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18813
        val known = Metis_IntMap.insert known (id,(eqn,ort))
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18814
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18815
        val redexes = addRedexes id (eqn,ort) redexes
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18816
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18817
        val waiting = Metis_IntSet.add waiting id
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18818
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18819
        val rw =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18820
            Metis_Rewrite
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18821
              {order = order, known = known, redexes = redexes,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18822
               subterms = subterms, waiting = waiting}
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18823
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18824
        val () = Metis_Print.trace pp "Metis_Rewrite.add: result" rw
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18825
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18826
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18827
        rw
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18828
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18829
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18830
local
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18831
  fun uncurriedAdd (eqn,rw) = add rw eqn;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18832
in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18833
  fun addList rw = List.foldl uncurriedAdd rw;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18834
end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18835
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18836
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18837
(* Rewriting (the order must be a refinement of the rewrite order).          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18838
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18839
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18840
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18841
  fun reorder ((i,_),(j,_)) = Int.compare (j,i);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18842
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18843
  fun matchingRedexes redexes tm = sort reorder (Metis_TermNet.match redexes tm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18844
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18845
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18846
fun wellOriented NONE _ = true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18847
  | wellOriented (SOME LeftToRight) LeftToRight = true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18848
  | wellOriented (SOME RightToLeft) RightToLeft = true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18849
  | wellOriented _ _ = false;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18850
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18851
fun redexResidue LeftToRight ((l_r,_) : equation) = l_r
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18852
  | redexResidue RightToLeft ((l,r),_) = (r,l);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18853
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18854
fun orientedEquation LeftToRight eqn = eqn
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18855
  | orientedEquation RightToLeft eqn = Metis_Rule.symEqn eqn;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18856
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18857
fun rewrIdConv' order known redexes id tm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18858
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18859
      fun rewr (id',lr) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18860
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18861
            val _ = id <> id' orelse raise Error "same theorem"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18862
            val (eqn,ort) = Metis_IntMap.get known id'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18863
            val _ = wellOriented ort lr orelse raise Error "orientation"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18864
            val (l,r) = redexResidue lr eqn
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18865
            val sub = Metis_Subst.normalize (Metis_Subst.match Metis_Subst.empty l tm)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18866
            val tm' = Metis_Subst.subst sub r
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18867
            val _ = Option.isSome ort orelse
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18868
                    order (tm,tm') = SOME GREATER orelse
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18869
                    raise Error "order"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18870
            val (_,th) = orientedEquation lr eqn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18871
          in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18872
            (tm', Metis_Thm.subst sub th)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18873
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18874
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18875
      case first (total rewr) (matchingRedexes redexes tm) of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18876
        NONE => raise Error "Metis_Rewrite.rewrIdConv: no matching rewrites"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18877
      | SOME res => res
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18878
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18879
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18880
fun rewriteIdConv' order known redexes id =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18881
    if Metis_IntMap.null known then Metis_Rule.allConv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18882
    else Metis_Rule.repeatTopDownConv (rewrIdConv' order known redexes id);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18883
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18884
fun mkNeqConv order lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18885
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18886
      val (l,r) = Metis_Literal.destNeq lit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18887
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18888
      case order (l,r) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18889
        NONE => raise Error "incomparable"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18890
      | SOME LESS =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18891
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18892
          val th = Metis_Rule.symmetryRule l r
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18893
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18894
          fn tm =>
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18895
             if Metis_Term.equal tm r then (l,th) else raise Error "mkNeqConv: RL"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18896
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18897
      | SOME EQUAL => raise Error "irreflexive"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18898
      | SOME GREATER =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18899
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18900
          val th = Metis_Thm.assume lit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18901
        in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18902
          fn tm =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18903
             if Metis_Term.equal tm l then (r,th) else raise Error "mkNeqConv: LR"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18904
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18905
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18906
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18907
datatype neqConvs = NeqConvs of Metis_Rule.conv Metis_LiteralMap.map;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18908
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18909
val neqConvsEmpty = NeqConvs (Metis_LiteralMap.new ());
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18910
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18911
fun neqConvsNull (NeqConvs m) = Metis_LiteralMap.null m;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18912
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18913
fun neqConvsAdd order (neq as NeqConvs m) lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18914
    case total (mkNeqConv order) lit of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18915
      NONE => NONE
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18916
    | SOME conv => SOME (NeqConvs (Metis_LiteralMap.insert m (lit,conv)));
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18917
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18918
fun mkNeqConvs order =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18919
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18920
      fun add (lit,(neq,lits)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18921
          case neqConvsAdd order neq lit of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18922
            SOME neq => (neq,lits)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18923
          | NONE => (neq, Metis_LiteralSet.add lits lit)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18924
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18925
      Metis_LiteralSet.foldl add (neqConvsEmpty,Metis_LiteralSet.empty)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18926
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18927
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18928
fun neqConvsDelete (NeqConvs m) lit = NeqConvs (Metis_LiteralMap.delete m lit);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18929
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18930
fun neqConvsToConv (NeqConvs m) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18931
    Metis_Rule.firstConv (Metis_LiteralMap.foldr (fn (_,c,l) => c :: l) [] m);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18932
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18933
fun neqConvsFoldl f b (NeqConvs m) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18934
    Metis_LiteralMap.foldl (fn (l,_,z) => f (l,z)) b m;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18935
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18936
fun neqConvsRewrIdLiterule order known redexes id neq =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18937
    if Metis_IntMap.null known andalso neqConvsNull neq then Metis_Rule.allLiterule
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18938
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18939
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18940
        val neq_conv = neqConvsToConv neq
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18941
        val rewr_conv = rewrIdConv' order known redexes id
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18942
        val conv = Metis_Rule.orelseConv neq_conv rewr_conv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18943
        val conv = Metis_Rule.repeatTopDownConv conv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18944
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18945
        Metis_Rule.allArgumentsLiterule conv
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18946
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18947
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18948
fun rewriteIdEqn' order known redexes id (eqn as (l_r,th)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18949
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18950
      val (neq,_) = mkNeqConvs order (Metis_Thm.clause th)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18951
      val literule = neqConvsRewrIdLiterule order known redexes id neq
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18952
      val (strongEqn,lit) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18953
          case Metis_Rule.equationLiteral eqn of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18954
            NONE => (true, Metis_Literal.mkEq l_r)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18955
          | SOME lit => (false,lit)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18956
      val (lit',litTh) = literule lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18957
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18958
      if Metis_Literal.equal lit lit' then eqn
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18959
      else
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18960
        (Metis_Literal.destEq lit',
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18961
         if strongEqn then th
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18962
         else if not (Metis_Thm.negateMember lit litTh) then litTh
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18963
         else Metis_Thm.resolve lit th litTh)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18964
    end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18965
(*MetisDebug
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18966
    handle Error err => raise Error ("Metis_Rewrite.rewriteIdEqn':\n" ^ err);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18967
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18968
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18969
fun rewriteIdLiteralsRule' order known redexes id lits th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18970
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18971
      val mk_literule = neqConvsRewrIdLiterule order known redexes id
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18972
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18973
      fun rewr_neq_lit (lit, acc as (changed,neq,lits,th)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18974
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18975
            val neq = neqConvsDelete neq lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18976
            val (lit',litTh) = mk_literule neq lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18977
          in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18978
            if Metis_Literal.equal lit lit' then acc
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18979
            else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18980
              let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18981
                val th = Metis_Thm.resolve lit th litTh
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18982
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18983
                case neqConvsAdd order neq lit' of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18984
                  SOME neq => (true,neq,lits,th)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18985
                | NONE => (changed, neq, Metis_LiteralSet.add lits lit', th)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18986
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18987
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18988
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18989
      fun rewr_neq_lits neq lits th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18990
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18991
            val (changed,neq,lits,th) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18992
                neqConvsFoldl rewr_neq_lit (false,neq,lits,th) neq
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18993
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18994
            if changed then rewr_neq_lits neq lits th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18995
            else (neq,lits,th)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18996
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18997
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18998
      val (neq,lits) = mkNeqConvs order lits
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18999
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19000
      val (neq,lits,th) = rewr_neq_lits neq lits th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19001
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19002
      val rewr_literule = mk_literule neq
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19003
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19004
      fun rewr_lit (lit,th) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19005
          if Metis_Thm.member lit th then Metis_Rule.literalRule rewr_literule lit th
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19006
          else th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19007
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19008
      Metis_LiteralSet.foldl rewr_lit th lits
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19009
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19010
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19011
fun rewriteIdRule' order known redexes id th =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19012
    rewriteIdLiteralsRule' order known redexes id (Metis_Thm.clause th) th;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19013
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19014
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19015
val rewriteIdRule' = fn order => fn known => fn redexes => fn id => fn th =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19016
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19017
(*MetisTrace6
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19018
      val () = Metis_Print.trace Metis_Thm.pp "Metis_Rewrite.rewriteIdRule': th" th
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19019
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19020
      val result = rewriteIdRule' order known redexes id th
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19021
(*MetisTrace6
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19022
      val () = Metis_Print.trace Metis_Thm.pp "Metis_Rewrite.rewriteIdRule': result" result
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19023
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19024
      val _ = not (thmReducible order known id result) orelse
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19025
              raise Bug "rewriteIdRule: should be normalized"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19026
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19027
      result
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19028
    end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19029
    handle Error err => raise Error ("Metis_Rewrite.rewriteIdRule:\n" ^ err);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19030
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19031
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19032
fun rewrIdConv (Metis_Rewrite {known,redexes,...}) order =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19033
    rewrIdConv' order known redexes;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19034
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19035
fun rewrConv rewrite order = rewrIdConv rewrite order ~1;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19036
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19037
fun rewriteIdConv (Metis_Rewrite {known,redexes,...}) order =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19038
    rewriteIdConv' order known redexes;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19039
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19040
fun rewriteConv rewrite order = rewriteIdConv rewrite order ~1;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19041
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19042
fun rewriteIdLiteralsRule (Metis_Rewrite {known,redexes,...}) order =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19043
    rewriteIdLiteralsRule' order known redexes;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19044
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19045
fun rewriteLiteralsRule rewrite order =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19046
    rewriteIdLiteralsRule rewrite order ~1;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19047
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19048
fun rewriteIdRule (Metis_Rewrite {known,redexes,...}) order =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19049
    rewriteIdRule' order known redexes;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19050
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19051
fun rewriteRule rewrite order = rewriteIdRule rewrite order ~1;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19052
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19053
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19054
(* Inter-reduce the equations in the system.                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19055
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19056
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19057
fun addSubterms id (((l,r),_) : equation) subterms =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19058
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19059
      fun addSubterm b ((path,tm),net) = Metis_TermNet.insert net (tm,(id,b,path))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19060
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19061
      val subterms = List.foldl (addSubterm true) subterms (Metis_Term.subterms l)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19062
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19063
      val subterms = List.foldl (addSubterm false) subterms (Metis_Term.subterms r)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19064
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19065
      subterms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19066
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19067
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19068
fun sameRedexes NONE _ _ = false
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19069
  | sameRedexes (SOME LeftToRight) (l0,_) (l,_) = Metis_Term.equal l0 l
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19070
  | sameRedexes (SOME RightToLeft) (_,r0) (_,r) = Metis_Term.equal r0 r;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19071
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19072
fun redexResidues NONE (l,r) = [(l,r,false),(r,l,false)]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19073
  | redexResidues (SOME LeftToRight) (l,r) = [(l,r,true)]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19074
  | redexResidues (SOME RightToLeft) (l,r) = [(r,l,true)];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19075
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19076
fun findReducibles order known subterms id =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19077
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19078
      fun checkValidRewr (l,r,ord) id' left path =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19079
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19080
            val (((x,y),_),_) = Metis_IntMap.get known id'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19081
            val tm = Metis_Term.subterm (if left then x else y) path
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19082
            val sub = Metis_Subst.match Metis_Subst.empty l tm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19083
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19084
            if ord then ()
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19085
            else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19086
              let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19087
                val tm' = Metis_Subst.subst (Metis_Subst.normalize sub) r
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19088
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19089
                if order (tm,tm') = SOME GREATER then ()
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19090
                else raise Error "order"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19091
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19092
          end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19093
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19094
      fun addRed lr ((id',left,path),todo) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19095
          if id <> id' andalso not (Metis_IntSet.member id' todo) andalso
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19096
             can (checkValidRewr lr id' left) path
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19097
          then Metis_IntSet.add todo id'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19098
          else todo
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19099
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19100
      fun findRed (lr as (l,_,_), todo) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19101
          List.foldl (addRed lr) todo (Metis_TermNet.matched subterms l)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19102
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19103
      List.foldl findRed
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19104
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19105
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19106
fun reduce1 new id (eqn0,ort0) (rpl,spl,todo,rw,changed) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19107
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19108
      val (eq0,_) = eqn0
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19109
      val Metis_Rewrite {order,known,redexes,subterms,waiting} = rw
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19110
      val eqn as (eq,_) = rewriteIdEqn' order known redexes id eqn0
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19111
      val identical =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19112
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19113
            val (l0,r0) = eq0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19114
            and (l,r) = eq
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19115
          in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19116
            Metis_Term.equal l l0 andalso Metis_Term.equal r r0
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19117
          end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19118
      val same_redexes = identical orelse sameRedexes ort0 eq0 eq
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19119
      val rpl = if same_redexes then rpl else Metis_IntSet.add rpl id
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19120
      val spl = if new orelse identical then spl else Metis_IntSet.add spl id
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19121
      val changed =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19122
          if not new andalso identical then changed else Metis_IntSet.add changed id
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19123
      val ort =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19124
          if same_redexes then SOME ort0 else total orderToOrient (order eq)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19125
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19126
      case ort of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19127
        NONE =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19128
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19129
          val known = Metis_IntMap.delete known id
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19130
          val rw =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19131
              Metis_Rewrite
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19132
                {order = order, known = known, redexes = redexes,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19133
                 subterms = subterms, waiting = waiting}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19134
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19135
          (rpl,spl,todo,rw,changed)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19136
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19137
      | SOME ort =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19138
        let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19139
          val todo =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19140
              if not new andalso same_redexes then todo
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19141
              else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19142
                findReducibles
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19143
                  order known subterms id todo (redexResidues ort eq)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19144
          val known =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19145
              if identical then known else Metis_IntMap.insert known (id,(eqn,ort))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19146
          val redexes =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19147
              if same_redexes then redexes
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19148
              else addRedexes id (eqn,ort) redexes
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19149
          val subterms =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19150
              if new orelse not identical then addSubterms id eqn subterms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19151
              else subterms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19152
          val rw =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19153
              Metis_Rewrite
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19154
                {order = order, known = known, redexes = redexes,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19155
                 subterms = subterms, waiting = waiting}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19156
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19157
          (rpl,spl,todo,rw,changed)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19158
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19159
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19160
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19161
fun pick known set =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19162
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19163
      fun oriented id =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19164
          case Metis_IntMap.peek known id of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19165
            SOME (x as (_, SOME _)) => SOME (id,x)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19166
          | _ => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19167
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19168
      fun any id =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19169
          case Metis_IntMap.peek known id of SOME x => SOME (id,x) | _ => NONE
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19170
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19171
      case Metis_IntSet.firstl oriented set of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19172
        x as SOME _ => x
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19173
      | NONE => Metis_IntSet.firstl any set
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19174
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19175
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19176
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19177
  fun cleanRedexes known redexes rpl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19178
      if Metis_IntSet.null rpl then redexes
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19179
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19180
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19181
          fun filt (id,_) = not (Metis_IntSet.member id rpl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19182
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19183
          fun addReds (id,reds) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19184
              case Metis_IntMap.peek known id of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19185
                NONE => reds
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19186
              | SOME eqn_ort => addRedexes id eqn_ort reds
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19187
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19188
          val redexes = Metis_TermNet.filter filt redexes
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19189
          val redexes = Metis_IntSet.foldl addReds redexes rpl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19190
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19191
          redexes
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19192
        end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19193
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19194
  fun cleanSubterms known subterms spl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19195
      if Metis_IntSet.null spl then subterms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19196
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19197
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19198
          fun filt (id,_,_) = not (Metis_IntSet.member id spl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19199
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19200
          fun addSubtms (id,subtms) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19201
              case Metis_IntMap.peek known id of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19202
                NONE => subtms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19203
              | SOME (eqn,_) => addSubterms id eqn subtms
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19204
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19205
          val subterms = Metis_TermNet.filter filt subterms
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19206
          val subterms = Metis_IntSet.foldl addSubtms subterms spl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19207
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19208
          subterms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19209
        end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19210
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19211
  fun rebuild rpl spl rw =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19212
      let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19213
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19214
        val ppPl = Metis_Print.ppMap Metis_IntSet.toList (Metis_Print.ppList Metis_Print.ppInt)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19215
        val () = Metis_Print.trace ppPl "Metis_Rewrite.rebuild: rpl" rpl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19216
        val () = Metis_Print.trace ppPl "Metis_Rewrite.rebuild: spl" spl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19217
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19218
        val Metis_Rewrite {order,known,redexes,subterms,waiting} = rw
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19219
        val redexes = cleanRedexes known redexes rpl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19220
        val subterms = cleanSubterms known subterms spl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19221
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19222
        Metis_Rewrite
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19223
          {order = order,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19224
           known = known,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19225
           redexes = redexes,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19226
           subterms = subterms,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19227
           waiting = waiting}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19228
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19229
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19230
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19231
fun reduceAcc (rpl, spl, todo, rw as Metis_Rewrite {known,waiting,...}, changed) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19232
    case pick known todo of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19233
      SOME (id,eqn_ort) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19234
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19235
        val todo = Metis_IntSet.delete todo id
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19236
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19237
        reduceAcc (reduce1 false id eqn_ort (rpl,spl,todo,rw,changed))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19238
      end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19239
    | NONE =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19240
      case pick known waiting of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19241
        SOME (id,eqn_ort) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19242
        let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19243
          val rw = deleteWaiting rw id
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19244
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19245
          reduceAcc (reduce1 true id eqn_ort (rpl,spl,todo,rw,changed))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19246
        end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19247
      | NONE => (rebuild rpl spl rw, Metis_IntSet.toList changed);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19248
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19249
fun isReduced (Metis_Rewrite {waiting,...}) = Metis_IntSet.null waiting;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19250
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19251
fun reduce' rw =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19252
    if isReduced rw then (rw,[])
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19253
    else reduceAcc (Metis_IntSet.empty,Metis_IntSet.empty,Metis_IntSet.empty,rw,Metis_IntSet.empty);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19254
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19255
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19256
val reduce' = fn rw =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19257
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19258
(*MetisTrace4
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19259
      val () = Metis_Print.trace pp "Metis_Rewrite.reduce': rw" rw
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19260
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19261
      val Metis_Rewrite {known,order,...} = rw
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19262
      val result as (Metis_Rewrite {known = known', ...}, _) = reduce' rw
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19263
(*MetisTrace4
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19264
      val ppResult = Metis_Print.ppPair pp (Metis_Print.ppList Metis_Print.ppInt)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19265
      val () = Metis_Print.trace ppResult "Metis_Rewrite.reduce': result" result
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19266
*)
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19267
      val ths = List.map (fn (id,((_,th),_)) => (id,th)) (Metis_IntMap.toList known')
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19268
      val _ =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19269
          not (List.exists (uncurry (thmReducible order known')) ths) orelse
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19270
          raise Bug "Metis_Rewrite.reduce': not fully reduced"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19271
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19272
      result
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19273
    end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19274
    handle Error err => raise Bug ("Metis_Rewrite.reduce': shouldn't fail\n" ^ err);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19275
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19276
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19277
fun reduce rw = fst (reduce' rw);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19278
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19279
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19280
(* Rewriting as a derived rule.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19281
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19282
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19283
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19284
  fun addEqn (id_eqn,rw) = add rw id_eqn;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19285
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19286
  fun orderedRewrite order ths =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19287
    let
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19288
      val rw = List.foldl addEqn (new order) (enumerate ths)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19289
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19290
      rewriteRule rw order
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19291
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19292
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19293
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19294
local
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19295
  val order : reductionOrder = K (SOME GREATER);
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19296
in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19297
  val rewrite = orderedRewrite order;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19298
end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19299
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19300
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19301
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19302
(**** Original file: src/Units.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19303
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19304
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19305
(* A STORE FOR UNIT THEOREMS                                                 *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19306
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19307
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19308
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19309
signature Metis_Units =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19310
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19311
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19312
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19313
(* A type of unit store.                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19314
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19315
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19316
type unitThm = Metis_Literal.literal * Metis_Thm.thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19317
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19318
type units
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19319
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19320
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19321
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19322
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19323
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19324
val empty : units
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19325
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19326
val size : units -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19327
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19328
val toString : units -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19329
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19330
val pp : units Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19331
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19332
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19333
(* Add units into the store.                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19334
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19335
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19336
val add : units -> unitThm -> units
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19337
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19338
val addList : units -> unitThm list -> units
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19339
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19340
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19341
(* Matching.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19342
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19343
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19344
val match : units -> Metis_Literal.literal -> (unitThm * Metis_Subst.subst) option
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19345
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19346
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19347
(* Reducing by repeated matching and resolution.                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19348
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19349
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19350
val reduce : units -> Metis_Rule.rule
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19351
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19352
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19353
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19354
(**** Original file: src/Units.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19355
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19356
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19357
(* A STORE FOR UNIT THEOREMS                                                 *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19358
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19359
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19360
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19361
structure Metis_Units :> Metis_Units =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19362
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19363
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19364
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19365
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19366
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19367
(* A type of unit store.                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19368
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19369
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19370
type unitThm = Metis_Literal.literal * Metis_Thm.thm;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19371
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19372
datatype units = Metis_Units of unitThm Metis_LiteralNet.literalNet;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19373
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19374
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19375
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19376
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19377
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19378
val empty = Metis_Units (Metis_LiteralNet.new {fifo = false});
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19379
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19380
fun size (Metis_Units net) = Metis_LiteralNet.size net;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19381
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19382
fun toString units = "U{" ^ Int.toString (size units) ^ "}";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19383
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19384
val pp = Metis_Print.ppMap toString Metis_Print.ppString;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19385
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19386
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19387
(* Add units into the store.                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19388
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19389
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19390
fun add (units as Metis_Units net) (uTh as (lit,th)) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19391
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19392
      val net = Metis_LiteralNet.insert net (lit,uTh)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19393
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19394
      case total Metis_Literal.sym lit of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19395
        NONE => Metis_Units net
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19396
      | SOME (lit' as (pol,_)) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19397
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19398
          val th' = (if pol then Metis_Rule.symEq else Metis_Rule.symNeq) lit th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19399
          val net = Metis_LiteralNet.insert net (lit',(lit',th'))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19400
        in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19401
          Metis_Units net
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19402
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19403
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19404
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19405
val addList = List.foldl (fn (th,u) => add u th);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19406
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19407
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19408
(* Matching.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19409
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19410
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19411
fun match (Metis_Units net) lit =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19412
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19413
      fun check (uTh as (lit',_)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19414
          case total (Metis_Literal.match Metis_Subst.empty lit') lit of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19415
            NONE => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19416
          | SOME sub => SOME (uTh,sub)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19417
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19418
      first check (Metis_LiteralNet.match net lit)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19419
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19420
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19421
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19422
(* Reducing by repeated matching and resolution.                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19423
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19424
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19425
fun reduce units =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19426
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19427
      fun red1 (lit,news_th) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19428
          case total Metis_Literal.destIrrefl lit of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19429
            SOME tm =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19430
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19431
              val (news,th) = news_th
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19432
              val th = Metis_Thm.resolve lit th (Metis_Thm.refl tm)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19433
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19434
              (news,th)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19435
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19436
          | NONE =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19437
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19438
              val lit' = Metis_Literal.negate lit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19439
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19440
              case match units lit' of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19441
                NONE => news_th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19442
              | SOME ((_,rth),sub) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19443
                let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19444
                  val (news,th) = news_th
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19445
                  val rth = Metis_Thm.subst sub rth
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19446
                  val th = Metis_Thm.resolve lit th rth
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19447
                  val new = Metis_LiteralSet.delete (Metis_Thm.clause rth) lit'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19448
                  val news = Metis_LiteralSet.union new news
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19449
                in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19450
                  (news,th)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19451
                end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19452
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19453
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19454
      fun red (news,th) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19455
          if Metis_LiteralSet.null news then th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19456
          else red (Metis_LiteralSet.foldl red1 (Metis_LiteralSet.empty,th) news)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19457
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19458
      fn th => Metis_Rule.removeSym (red (Metis_Thm.clause th, th))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19459
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19460
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19461
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19462
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19463
(**** Original file: src/Clause.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19464
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19465
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19466
(* CLAUSE = ID + THEOREM                                                     *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19467
(* Copyright (c) 2002 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19468
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19469
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19470
signature Metis_Clause =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19471
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19472
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19473
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19474
(* A type of clause.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19475
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19476
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19477
datatype literalOrder =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19478
    NoLiteralOrder
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19479
  | UnsignedLiteralOrder
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19480
  | PositiveLiteralOrder
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19481
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19482
type parameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19483
     {ordering : Metis_KnuthBendixOrder.kbo,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19484
      orderLiterals : literalOrder,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19485
      orderTerms : bool}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19486
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19487
type clauseId = int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19488
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19489
type clauseInfo = {parameters : parameters, id : clauseId, thm : Metis_Thm.thm}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19490
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19491
type clause
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19492
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19493
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19494
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19495
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19496
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19497
val default : parameters
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19498
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19499
val newId : unit -> clauseId
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19500
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19501
val mk : clauseInfo -> clause
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19502
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19503
val dest : clause -> clauseInfo
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19504
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19505
val id : clause -> clauseId
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19506
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19507
val thm : clause -> Metis_Thm.thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19508
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19509
val equalThms : clause -> clause -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19510
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19511
val literals : clause -> Metis_Thm.clause
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19512
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19513
val isTautology : clause -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19514
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19515
val isContradiction : clause -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19516
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19517
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19518
(* The term ordering is used to cut down inferences.                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19519
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19520
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19521
val largestLiterals : clause -> Metis_LiteralSet.set
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19522
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19523
val largestEquations :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19524
    clause -> (Metis_Literal.literal * Metis_Rewrite.orient * Metis_Term.term) list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19525
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19526
val largestSubterms :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19527
    clause -> (Metis_Literal.literal * Metis_Term.path * Metis_Term.term) list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19528
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19529
val allSubterms : clause -> (Metis_Literal.literal * Metis_Term.path * Metis_Term.term) list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19530
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19531
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19532
(* Subsumption.                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19533
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19534
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19535
val subsumes : clause Metis_Subsume.subsume -> clause -> bool
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19536
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19537
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19538
(* Simplifying rules: these preserve the clause id.                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19539
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19540
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19541
val freshVars : clause -> clause
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19542
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19543
val simplify : clause -> clause option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19544
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19545
val reduce : Metis_Units.units -> clause -> clause
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19546
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19547
val rewrite : Metis_Rewrite.rewrite -> clause -> clause
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19548
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19549
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19550
(* Inference rules: these generate new clause ids.                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19551
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19552
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19553
val factor : clause -> clause list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19554
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19555
val resolve : clause * Metis_Literal.literal -> clause * Metis_Literal.literal -> clause
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19556
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19557
val paramodulate :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19558
    clause * Metis_Literal.literal * Metis_Rewrite.orient * Metis_Term.term ->
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19559
    clause * Metis_Literal.literal * Metis_Term.path * Metis_Term.term -> clause
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19560
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19561
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19562
(* Pretty printing.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19563
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19564
32740
9dd0a2f83429 explicit indication of Unsynchronized.ref;
wenzelm
parents: 30161
diff changeset
 19565
val showId : bool Unsynchronized.ref
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19566
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19567
val pp : clause Metis_Print.pp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19568
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19569
val toString : clause -> string
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19570
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19571
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19572
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19573
(**** Original file: src/Clause.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19574
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19575
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19576
(* CLAUSE = ID + THEOREM                                                     *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19577
(* Copyright (c) 2002 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19578
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19579
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19580
structure Metis_Clause :> Metis_Clause =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19581
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19582
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19583
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19584
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19585
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19586
(* Helper functions.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19587
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19588
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19589
val newId =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19590
    let
32740
9dd0a2f83429 explicit indication of Unsynchronized.ref;
wenzelm
parents: 30161
diff changeset
 19591
      val r = Unsynchronized.ref 0
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19592
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19593
      fun new () =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19594
          let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19595
            val Unsynchronized.ref n = r
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19596
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19597
            val () = r := n + 1
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19598
          in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19599
            n
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19600
          end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19601
    in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19602
      fn () => Metis_Portable.critical new ()
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19603
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19604
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19605
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19606
(* A type of clause.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19607
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19608
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19609
datatype literalOrder =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19610
    NoLiteralOrder
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19611
  | UnsignedLiteralOrder
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19612
  | PositiveLiteralOrder;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19613
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19614
type parameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19615
     {ordering : Metis_KnuthBendixOrder.kbo,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19616
      orderLiterals : literalOrder,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19617
      orderTerms : bool};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19618
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19619
type clauseId = int;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19620
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19621
type clauseInfo = {parameters : parameters, id : clauseId, thm : Metis_Thm.thm};
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19622
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19623
datatype clause = Metis_Clause of clauseInfo;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19624
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19625
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19626
(* Pretty printing.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19627
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19628
32740
9dd0a2f83429 explicit indication of Unsynchronized.ref;
wenzelm
parents: 30161
diff changeset
 19629
val showId = Unsynchronized.ref false;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19630
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19631
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19632
  val ppIdThm = Metis_Print.ppPair Metis_Print.ppInt Metis_Thm.pp;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19633
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19634
  fun pp (Metis_Clause {id,thm,...}) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19635
      if !showId then ppIdThm (id,thm) else Metis_Thm.pp thm;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19636
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19637
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19638
fun toString cl = Metis_Print.toString pp cl;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19639
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19640
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19641
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19642
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19643
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19644
val default : parameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19645
    {ordering = Metis_KnuthBendixOrder.default,
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19646
     orderLiterals = PositiveLiteralOrder,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19647
     orderTerms = true};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19648
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19649
fun mk info = Metis_Clause info
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19650
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19651
fun dest (Metis_Clause info) = info;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19652
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19653
fun id (Metis_Clause {id = i, ...}) = i;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19654
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19655
fun thm (Metis_Clause {thm = th, ...}) = th;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19656
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19657
fun equalThms cl cl' = Metis_Thm.equal (thm cl) (thm cl');
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19658
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19659
fun new parameters thm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19660
    Metis_Clause {parameters = parameters, id = newId (), thm = thm};
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19661
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19662
fun literals cl = Metis_Thm.clause (thm cl);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19663
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19664
fun isTautology (Metis_Clause {thm,...}) = Metis_Thm.isTautology thm;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19665
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19666
fun isContradiction (Metis_Clause {thm,...}) = Metis_Thm.isContradiction thm;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19667
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19668
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19669
(* The term ordering is used to cut down inferences.                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19670
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19671
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19672
fun strictlyLess ordering x_y =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19673
    case Metis_KnuthBendixOrder.compare ordering x_y of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19674
      SOME LESS => true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19675
    | _ => false;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19676
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19677
fun isLargerTerm ({ordering,orderTerms,...} : parameters) l_r =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19678
    not orderTerms orelse not (strictlyLess ordering l_r);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19679
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19680
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19681
  fun atomToTerms atm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19682
      case total Metis_Atom.destEq atm of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19683
        NONE => [Metis_Term.Fn atm]
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 19684
      | SOME (l,r) => [l,r];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19685
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19686
  fun notStrictlyLess ordering (xs,ys) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19687
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19688
        fun less x = List.exists (fn y => strictlyLess ordering (x,y)) ys
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19689
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19690
        not (List.all less xs)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19691
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19692
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19693
  fun isLargerLiteral ({ordering,orderLiterals,...} : parameters) lits =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19694
      case orderLiterals of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19695
        NoLiteralOrder => K true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19696
      | UnsignedLiteralOrder =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19697
        let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19698
          fun addLit ((_,atm),acc) = atomToTerms atm @ acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19699
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19700
          val tms = Metis_LiteralSet.foldl addLit [] lits
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19701
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19702
          fn (_,atm') => notStrictlyLess ordering (atomToTerms atm', tms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19703
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19704
      | PositiveLiteralOrder =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19705
        case Metis_LiteralSet.findl (K true) lits of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19706
          NONE => K true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19707
        | SOME (pol,_) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19708
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19709
            fun addLit ((p,atm),acc) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19710
                if p = pol then atomToTerms atm @ acc else acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19711
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19712
            val tms = Metis_LiteralSet.foldl addLit [] lits
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19713
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19714
            fn (pol',atm') =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19715
               if pol <> pol' then pol
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19716
               else notStrictlyLess ordering (atomToTerms atm', tms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19717
          end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19718
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19719
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19720
fun largestLiterals (Metis_Clause {parameters,thm,...}) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19721
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19722
      val litSet = Metis_Thm.clause thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19723
      val isLarger = isLargerLiteral parameters litSet
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19724
      fun addLit (lit,s) = if isLarger lit then Metis_LiteralSet.add s lit else s
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19725
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19726
      Metis_LiteralSet.foldr addLit Metis_LiteralSet.empty litSet
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19727
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19728
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19729
(*MetisTrace6
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19730
val largestLiterals = fn cl =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19731
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19732
      val ppResult = Metis_LiteralSet.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19733
      val () = Metis_Print.trace pp "Metis_Clause.largestLiterals: cl" cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19734
      val result = largestLiterals cl
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19735
      val () = Metis_Print.trace ppResult "Metis_Clause.largestLiterals: result" result
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19736
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19737
      result
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19738
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19739
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19740
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19741
fun largestEquations (cl as Metis_Clause {parameters,...}) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19742
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19743
      fun addEq lit ort (l_r as (l,_)) acc =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19744
          if isLargerTerm parameters l_r then (lit,ort,l) :: acc else acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19745
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19746
      fun addLit (lit,acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19747
          case total Metis_Literal.destEq lit of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19748
            NONE => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19749
          | SOME (l,r) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19750
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19751
              val acc = addEq lit Metis_Rewrite.RightToLeft (r,l) acc
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19752
              val acc = addEq lit Metis_Rewrite.LeftToRight (l,r) acc
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19753
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19754
              acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19755
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19756
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19757
      Metis_LiteralSet.foldr addLit [] (largestLiterals cl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19758
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19759
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19760
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19761
  fun addLit (lit,acc) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19762
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19763
        fun addTm ((path,tm),acc) = (lit,path,tm) :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19764
      in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19765
        List.foldl addTm acc (Metis_Literal.nonVarTypedSubterms lit)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19766
      end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19767
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19768
  fun largestSubterms cl = Metis_LiteralSet.foldl addLit [] (largestLiterals cl);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19769
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19770
  fun allSubterms cl = Metis_LiteralSet.foldl addLit [] (literals cl);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19771
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19772
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19773
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19774
(* Subsumption.                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19775
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19776
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19777
fun subsumes (subs : clause Metis_Subsume.subsume) cl =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19778
    Metis_Subsume.isStrictlySubsumed subs (literals cl);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19779
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19780
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19781
(* Simplifying rules: these preserve the clause id.                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19782
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19783
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19784
fun freshVars (Metis_Clause {parameters,id,thm}) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19785
    Metis_Clause {parameters = parameters, id = id, thm = Metis_Rule.freshVars thm};
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19786
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19787
fun simplify (Metis_Clause {parameters,id,thm}) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19788
    case Metis_Rule.simplify thm of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19789
      NONE => NONE
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19790
    | SOME thm => SOME (Metis_Clause {parameters = parameters, id = id, thm = thm});
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19791
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19792
fun reduce units (Metis_Clause {parameters,id,thm}) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19793
    Metis_Clause {parameters = parameters, id = id, thm = Metis_Units.reduce units thm};
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19794
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19795
fun rewrite rewr (cl as Metis_Clause {parameters,id,thm}) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19796
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19797
      fun simp th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19798
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19799
            val {ordering,...} = parameters
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19800
            val cmp = Metis_KnuthBendixOrder.compare ordering
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19801
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19802
            Metis_Rewrite.rewriteIdRule rewr cmp id th
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19803
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19804
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19805
(*MetisTrace4
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19806
      val () = Metis_Print.trace Metis_Rewrite.pp "Metis_Clause.rewrite: rewr" rewr
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19807
      val () = Metis_Print.trace Metis_Print.ppInt "Metis_Clause.rewrite: id" id
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19808
      val () = Metis_Print.trace pp "Metis_Clause.rewrite: cl" cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19809
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19810
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19811
      val thm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19812
          case Metis_Rewrite.peek rewr id of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19813
            NONE => simp thm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19814
          | SOME ((_,thm),_) => if Metis_Rewrite.isReduced rewr then thm else simp thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19815
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19816
      val result = Metis_Clause {parameters = parameters, id = id, thm = thm}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19817
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19818
(*MetisTrace4
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19819
      val () = Metis_Print.trace pp "Metis_Clause.rewrite: result" result
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19820
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19821
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19822
      result
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19823
    end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19824
(*MetisDebug
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19825
    handle Error err => raise Error ("Metis_Clause.rewrite:\n" ^ err);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19826
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19827
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19828
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19829
(* Inference rules: these generate new clause ids.                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19830
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19831
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19832
fun factor (cl as Metis_Clause {parameters,thm,...}) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19833
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19834
      val lits = largestLiterals cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19835
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19836
      fun apply sub = new parameters (Metis_Thm.subst sub thm)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19837
    in
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19838
      List.map apply (Metis_Rule.factor' lits)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19839
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19840
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19841
(*MetisTrace5
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19842
val factor = fn cl =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19843
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19844
      val () = Metis_Print.trace pp "Metis_Clause.factor: cl" cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19845
      val result = factor cl
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19846
      val () = Metis_Print.trace (Metis_Print.ppList pp) "Metis_Clause.factor: result" result
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19847
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19848
      result
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19849
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19850
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19851
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19852
fun resolve (cl1,lit1) (cl2,lit2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19853
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19854
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19855
      val () = Metis_Print.trace pp "Metis_Clause.resolve: cl1" cl1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19856
      val () = Metis_Print.trace Metis_Literal.pp "Metis_Clause.resolve: lit1" lit1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19857
      val () = Metis_Print.trace pp "Metis_Clause.resolve: cl2" cl2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19858
      val () = Metis_Print.trace Metis_Literal.pp "Metis_Clause.resolve: lit2" lit2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19859
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19860
      val Metis_Clause {parameters, thm = th1, ...} = cl1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19861
      and Metis_Clause {thm = th2, ...} = cl2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19862
      val sub = Metis_Literal.unify Metis_Subst.empty lit1 (Metis_Literal.negate lit2)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19863
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19864
      val () = Metis_Print.trace Metis_Subst.pp "Metis_Clause.resolve: sub" sub
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19865
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19866
      val lit1 = Metis_Literal.subst sub lit1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19867
      val lit2 = Metis_Literal.negate lit1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19868
      val th1 = Metis_Thm.subst sub th1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19869
      and th2 = Metis_Thm.subst sub th2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19870
      val _ = isLargerLiteral parameters (Metis_Thm.clause th1) lit1 orelse
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19871
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19872
              (trace "Metis_Clause.resolve: th1 violates ordering\n"; false) orelse
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19873
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19874
              raise Error "resolve: clause1: ordering constraints"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19875
      val _ = isLargerLiteral parameters (Metis_Thm.clause th2) lit2 orelse
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19876
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19877
              (trace "Metis_Clause.resolve: th2 violates ordering\n"; false) orelse
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19878
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19879
              raise Error "resolve: clause2: ordering constraints"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19880
      val th = Metis_Thm.resolve lit1 th1 th2
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19881
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19882
      val () = Metis_Print.trace Metis_Thm.pp "Metis_Clause.resolve: th" th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19883
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19884
      val cl = Metis_Clause {parameters = parameters, id = newId (), thm = th}
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19885
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19886
      val () = Metis_Print.trace pp "Metis_Clause.resolve: cl" cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19887
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19888
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19889
      cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19890
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19891
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19892
fun paramodulate (cl1,lit1,ort1,tm1) (cl2,lit2,path2,tm2) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19893
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19894
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19895
      val () = Metis_Print.trace pp "Metis_Clause.paramodulate: cl1" cl1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19896
      val () = Metis_Print.trace Metis_Literal.pp "Metis_Clause.paramodulate: lit1" lit1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19897
      val () = Metis_Print.trace Metis_Rewrite.ppOrient "Metis_Clause.paramodulate: ort1" ort1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19898
      val () = Metis_Print.trace Metis_Term.pp "Metis_Clause.paramodulate: tm1" tm1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19899
      val () = Metis_Print.trace pp "Metis_Clause.paramodulate: cl2" cl2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19900
      val () = Metis_Print.trace Metis_Literal.pp "Metis_Clause.paramodulate: lit2" lit2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19901
      val () = Metis_Print.trace Metis_Term.ppPath "Metis_Clause.paramodulate: path2" path2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19902
      val () = Metis_Print.trace Metis_Term.pp "Metis_Clause.paramodulate: tm2" tm2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19903
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19904
      val Metis_Clause {parameters, thm = th1, ...} = cl1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19905
      and Metis_Clause {thm = th2, ...} = cl2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19906
      val sub = Metis_Subst.unify Metis_Subst.empty tm1 tm2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19907
      val lit1 = Metis_Literal.subst sub lit1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19908
      and lit2 = Metis_Literal.subst sub lit2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19909
      and th1 = Metis_Thm.subst sub th1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19910
      and th2 = Metis_Thm.subst sub th2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19911
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19912
      val _ = isLargerLiteral parameters (Metis_Thm.clause th1) lit1 orelse
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19913
              raise Error "Metis_Clause.paramodulate: with clause: ordering"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19914
      val _ = isLargerLiteral parameters (Metis_Thm.clause th2) lit2 orelse
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19915
              raise Error "Metis_Clause.paramodulate: into clause: ordering"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19916
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19917
      val eqn = (Metis_Literal.destEq lit1, th1)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19918
      val eqn as (l_r,_) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19919
          case ort1 of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19920
            Metis_Rewrite.LeftToRight => eqn
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19921
          | Metis_Rewrite.RightToLeft => Metis_Rule.symEqn eqn
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19922
(*MetisTrace6
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19923
      val () = Metis_Print.trace Metis_Rule.ppEquation "Metis_Clause.paramodulate: eqn" eqn
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19924
*)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19925
      val _ = isLargerTerm parameters l_r orelse
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19926
              raise Error "Metis_Clause.paramodulate: equation: ordering constraints"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19927
      val th = Metis_Rule.rewrRule eqn lit2 path2 th2
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19928
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19929
      val () = Metis_Print.trace Metis_Thm.pp "Metis_Clause.paramodulate: th" th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19930
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19931
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19932
      Metis_Clause {parameters = parameters, id = newId (), thm = th}
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19933
    end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19934
(*MetisTrace5
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19935
    handle Error err =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19936
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19937
        val () = trace ("Metis_Clause.paramodulate: failed: " ^ err ^ "\n")
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19938
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19939
        raise Error err
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19940
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19941
*)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19942
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19943
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19944
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19945
(**** Original file: src/Active.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19946
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19947
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19948
(* THE ACTIVE SET OF CLAUSES                                                 *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19949
(* Copyright (c) 2002 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19950
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19951
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19952
signature Metis_Active =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19953
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19954
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19955
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19956
(* A type of active clause sets.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19957
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19958
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19959
type simplify =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19960
     {subsume : bool,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19961
      reduce : bool,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19962
      rewrite : bool}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19963
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19964
type parameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19965
     {clause : Metis_Clause.parameters,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19966
      prefactor : simplify,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19967
      postfactor : simplify}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19968
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19969
type active
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19970
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19971
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19972
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19973
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19974
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19975
val default : parameters
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19976
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19977
val size : active -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19978
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19979
val saturation : active -> Metis_Clause.clause list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19980
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19981
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19982
(* Create a new active clause set and initialize clauses.                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19983
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19984
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19985
val new :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19986
    parameters -> {axioms : Metis_Thm.thm list, conjecture : Metis_Thm.thm list} ->
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19987
    active * {axioms : Metis_Clause.clause list, conjecture : Metis_Clause.clause list}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19988
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19989
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19990
(* Add a clause into the active set and deduce all consequences.             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19991
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19992
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19993
val add : active -> Metis_Clause.clause -> active * Metis_Clause.clause list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19994
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19995
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19996
(* Pretty printing.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19997
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19998
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19999
val pp : active Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20000
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20001
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20002
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20003
(**** Original file: src/Active.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20004
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20005
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20006
(* THE ACTIVE SET OF CLAUSES                                                 *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20007
(* Copyright (c) 2002 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20008
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20009
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20010
structure Metis_Active :> Metis_Active =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20011
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20012
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20013
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20014
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20015
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20016
(* Helper functions.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20017
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20018
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20019
(*MetisDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20020
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20021
  fun mkRewrite ordering =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20022
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20023
        fun add (cl,rw) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20024
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20025
              val {id, thm = th, ...} = Metis_Clause.dest cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20026
            in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20027
              case total Metis_Thm.destUnitEq th of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20028
                SOME l_r => Metis_Rewrite.add rw (id,(l_r,th))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20029
              | NONE => rw
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20030
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20031
      in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20032
        List.foldl add (Metis_Rewrite.new (Metis_KnuthBendixOrder.compare ordering))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20033
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20034
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20035
  fun allFactors red =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20036
      let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20037
        fun allClause cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20038
            List.all red (cl :: Metis_Clause.factor cl) orelse
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20039
            let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20040
              val () = Metis_Print.trace Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20041
                         "Metis_Active.isSaturated.allFactors: cl" cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20042
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20043
              false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20044
            end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20045
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20046
        List.all allClause
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20047
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20048
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20049
  fun allResolutions red =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20050
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20051
        fun allClause2 cl_lit cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20052
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20053
              fun allLiteral2 lit =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20054
                  case total (Metis_Clause.resolve cl_lit) (cl,lit) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20055
                    NONE => true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20056
                  | SOME cl => allFactors red [cl]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20057
            in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20058
              Metis_LiteralSet.all allLiteral2 (Metis_Clause.literals cl)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20059
            end orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20060
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20061
              val () = Metis_Print.trace Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20062
                         "Metis_Active.isSaturated.allResolutions: cl2" cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20063
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20064
              false
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20065
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20066
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20067
        fun allClause1 allCls cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20068
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20069
              val cl = Metis_Clause.freshVars cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20070
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20071
              fun allLiteral1 lit = List.all (allClause2 (cl,lit)) allCls
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20072
            in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20073
              Metis_LiteralSet.all allLiteral1 (Metis_Clause.literals cl)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20074
            end orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20075
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20076
              val () = Metis_Print.trace Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20077
                         "Metis_Active.isSaturated.allResolutions: cl1" cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20078
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20079
              false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20080
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20081
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20082
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20083
        fn [] => true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20084
         | allCls as cl :: cls =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20085
           allClause1 allCls cl andalso allResolutions red cls
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20086
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20087
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20088
  fun allParamodulations red cls =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20089
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20090
        fun allClause2 cl_lit_ort_tm cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20091
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20092
              fun allLiteral2 lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20093
                  let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20094
                    val para = Metis_Clause.paramodulate cl_lit_ort_tm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20095
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20096
                    fun allSubterms (path,tm) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20097
                        case total para (cl,lit,path,tm) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20098
                          NONE => true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20099
                        | SOME cl => allFactors red [cl]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20100
                  in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20101
                    List.all allSubterms (Metis_Literal.nonVarTypedSubterms lit)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20102
                  end orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20103
                  let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20104
                    val () = Metis_Print.trace Metis_Literal.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20105
                               "Metis_Active.isSaturated.allParamodulations: lit2" lit
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20106
                  in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20107
                    false
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20108
                  end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20109
            in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20110
              Metis_LiteralSet.all allLiteral2 (Metis_Clause.literals cl)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20111
            end orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20112
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20113
              val () = Metis_Print.trace Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20114
                         "Metis_Active.isSaturated.allParamodulations: cl2" cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20115
              val (_,_,ort,_) = cl_lit_ort_tm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20116
              val () = Metis_Print.trace Metis_Rewrite.ppOrient
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20117
                         "Metis_Active.isSaturated.allParamodulations: ort1" ort
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20118
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20119
              false
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20120
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20121
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20122
        fun allClause1 cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20123
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20124
              val cl = Metis_Clause.freshVars cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20125
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20126
              fun allLiteral1 lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20127
                  let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20128
                    fun allCl2 x = List.all (allClause2 x) cls
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20129
                  in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20130
                    case total Metis_Literal.destEq lit of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20131
                      NONE => true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20132
                    | SOME (l,r) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20133
                      allCl2 (cl,lit,Metis_Rewrite.LeftToRight,l) andalso
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20134
                      allCl2 (cl,lit,Metis_Rewrite.RightToLeft,r)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20135
                  end orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20136
                  let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20137
                    val () = Metis_Print.trace Metis_Literal.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20138
                               "Metis_Active.isSaturated.allParamodulations: lit1" lit
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20139
                  in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20140
                    false
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20141
                  end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20142
            in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20143
              Metis_LiteralSet.all allLiteral1 (Metis_Clause.literals cl)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20144
            end orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20145
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20146
              val () = Metis_Print.trace Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20147
                         "Metis_Active.isSaturated.allParamodulations: cl1" cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20148
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20149
              false
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20150
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20151
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20152
        List.all allClause1 cls
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20153
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20154
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20155
  fun redundant {subsume,reduce,rewrite} =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20156
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20157
        fun simp cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20158
            case Metis_Clause.simplify cl of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20159
              NONE => true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20160
            | SOME cl =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20161
              Metis_Subsume.isStrictlySubsumed subsume (Metis_Clause.literals cl) orelse
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20162
              let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20163
                val cl' = cl
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20164
                val cl' = Metis_Clause.reduce reduce cl'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20165
                val cl' = Metis_Clause.rewrite rewrite cl'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20166
              in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20167
                not (Metis_Clause.equalThms cl cl') andalso
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20168
                (simp cl' orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20169
                 let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20170
                   val () = Metis_Print.trace Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20171
                              "Metis_Active.isSaturated.redundant: cl'" cl'
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20172
                 in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20173
                   false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20174
                 end)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20175
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20176
      in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20177
        fn cl =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20178
           simp cl orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20179
           let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20180
             val () = Metis_Print.trace Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20181
                        "Metis_Active.isSaturated.redundant: cl" cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20182
           in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20183
             false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20184
           end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20185
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20186
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20187
  fun isSaturated ordering subs cls =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20188
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20189
        val rd = Metis_Units.empty
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20190
        val rw = mkRewrite ordering cls
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20191
        val red = redundant {subsume = subs, reduce = rd, rewrite = rw}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20192
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20193
        (allFactors red cls andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20194
         allResolutions red cls andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20195
         allParamodulations red cls) orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20196
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20197
          val () = Metis_Print.trace Metis_Rewrite.pp "Metis_Active.isSaturated: rw" rw
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20198
          val () = Metis_Print.trace (Metis_Print.ppList Metis_Clause.pp)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20199
                     "Metis_Active.isSaturated: clauses" cls
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20200
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20201
          false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20202
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20203
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20204
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20205
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20206
fun checkSaturated ordering subs cls =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20207
    if isSaturated ordering subs cls then ()
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20208
    else raise Bug "Metis_Active.checkSaturated";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20209
*)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20210
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20211
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20212
(* A type of active clause sets.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20213
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20214
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20215
type simplify = {subsume : bool, reduce : bool, rewrite : bool};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20216
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20217
type parameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20218
     {clause : Metis_Clause.parameters,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20219
      prefactor : simplify,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20220
      postfactor : simplify};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20221
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20222
datatype active =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20223
    Metis_Active of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20224
      {parameters : parameters,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20225
       clauses : Metis_Clause.clause Metis_IntMap.map,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20226
       units : Metis_Units.units,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20227
       rewrite : Metis_Rewrite.rewrite,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20228
       subsume : Metis_Clause.clause Metis_Subsume.subsume,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20229
       literals : (Metis_Clause.clause * Metis_Literal.literal) Metis_LiteralNet.literalNet,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20230
       equations :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20231
         (Metis_Clause.clause * Metis_Literal.literal * Metis_Rewrite.orient * Metis_Term.term)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20232
         Metis_TermNet.termNet,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20233
       subterms :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20234
         (Metis_Clause.clause * Metis_Literal.literal * Metis_Term.path * Metis_Term.term)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20235
         Metis_TermNet.termNet,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20236
       allSubterms : (Metis_Clause.clause * Metis_Term.term) Metis_TermNet.termNet};
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20237
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20238
fun getSubsume (Metis_Active {subsume = s, ...}) = s;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20239
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20240
fun setRewrite active rewrite =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20241
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20242
      val Metis_Active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20243
            {parameters,clauses,units,subsume,literals,equations,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20244
             subterms,allSubterms,...} = active
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20245
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20246
      Metis_Active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20247
        {parameters = parameters, clauses = clauses, units = units,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20248
         rewrite = rewrite, subsume = subsume, literals = literals,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20249
         equations = equations, subterms = subterms, allSubterms = allSubterms}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20250
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20251
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20252
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20253
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20254
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20255
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20256
val maxSimplify : simplify = {subsume = true, reduce = true, rewrite = true};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20257
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20258
val default : parameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20259
    {clause = Metis_Clause.default,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20260
     prefactor = maxSimplify,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20261
     postfactor = maxSimplify};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20262
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20263
fun empty parameters =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20264
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20265
      val {clause,...} = parameters
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20266
      val {ordering,...} = clause
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20267
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20268
      Metis_Active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20269
        {parameters = parameters,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20270
         clauses = Metis_IntMap.new (),
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20271
         units = Metis_Units.empty,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20272
         rewrite = Metis_Rewrite.new (Metis_KnuthBendixOrder.compare ordering),
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20273
         subsume = Metis_Subsume.new (),
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20274
         literals = Metis_LiteralNet.new {fifo = false},
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20275
         equations = Metis_TermNet.new {fifo = false},
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20276
         subterms = Metis_TermNet.new {fifo = false},
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20277
         allSubterms = Metis_TermNet.new {fifo = false}}
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20278
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20279
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20280
fun size (Metis_Active {clauses,...}) = Metis_IntMap.size clauses;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20281
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20282
fun clauses (Metis_Active {clauses = cls, ...}) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20283
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20284
      fun add (_,cl,acc) = cl :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20285
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20286
      Metis_IntMap.foldr add [] cls
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20287
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20288
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20289
fun saturation active =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20290
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20291
      fun remove (cl,(cls,subs)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20292
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20293
            val lits = Metis_Clause.literals cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20294
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20295
            if Metis_Subsume.isStrictlySubsumed subs lits then (cls,subs)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20296
            else (cl :: cls, Metis_Subsume.insert subs (lits,()))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20297
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20298
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20299
      val cls = clauses active
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20300
      val (cls,_) = List.foldl remove ([], Metis_Subsume.new ()) cls
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20301
      val (cls,subs) = List.foldl remove ([], Metis_Subsume.new ()) cls
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20302
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20303
(*MetisDebug
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20304
      val Metis_Active {parameters,...} = active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20305
      val {clause,...} = parameters
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20306
      val {ordering,...} = clause
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20307
      val () = checkSaturated ordering subs cls
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20308
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20309
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20310
      cls
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20311
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20312
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20313
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20314
(* Pretty printing.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20315
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20316
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20317
val pp =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20318
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20319
      fun toStr active = "Metis_Active{" ^ Int.toString (size active) ^ "}"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20320
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20321
      Metis_Print.ppMap toStr Metis_Print.ppString
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20322
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20323
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20324
(*MetisDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20325
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20326
  fun ppField f ppA a =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 20327
      Metis_Print.inconsistentBlock 2
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20328
        [Metis_Print.ppString (f ^ " ="),
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 20329
         Metis_Print.break,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20330
         ppA a];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20331
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20332
  val ppClauses =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20333
      ppField "clauses"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20334
        (Metis_Print.ppMap Metis_IntMap.toList
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20335
           (Metis_Print.ppList (Metis_Print.ppPair Metis_Print.ppInt Metis_Clause.pp)));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20336
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20337
  val ppRewrite = ppField "rewrite" Metis_Rewrite.pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20338
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20339
  val ppSubterms =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20340
      ppField "subterms"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20341
        (Metis_TermNet.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20342
           (Metis_Print.ppMap (fn (c,l,p,t) => ((Metis_Clause.id c, l, p), t))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20343
              (Metis_Print.ppPair
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20344
                 (Metis_Print.ppTriple Metis_Print.ppInt Metis_Literal.pp Metis_Term.ppPath)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20345
                 Metis_Term.pp)));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20346
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20347
  fun pp (Metis_Active {clauses,rewrite,subterms,...}) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 20348
      Metis_Print.inconsistentBlock 2
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20349
        [Metis_Print.ppString "Metis_Active",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 20350
         Metis_Print.break,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 20351
         Metis_Print.inconsistentBlock 1
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20352
           [Metis_Print.ppString "{",
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20353
            ppClauses clauses,
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20354
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 20355
            Metis_Print.break,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20356
            ppRewrite rewrite,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20357
(*MetisTrace5
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20358
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 20359
            Metis_Print.break,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20360
            ppSubterms subterms,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20361
*)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20362
            Metis_Print.skip],
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20363
         Metis_Print.ppString "}"];
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20364
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20365
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20366
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20367
val toString = Metis_Print.toString pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20368
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20369
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20370
(* Simplify clauses.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20371
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20372
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20373
fun simplify simp units rewr subs =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20374
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20375
      val {subsume = s, reduce = r, rewrite = w} = simp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20376
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20377
      fun rewrite cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20378
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20379
            val cl' = Metis_Clause.rewrite rewr cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20380
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20381
            if Metis_Clause.equalThms cl cl' then SOME cl else Metis_Clause.simplify cl'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20382
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20383
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20384
      fn cl =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20385
         case Metis_Clause.simplify cl of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20386
           NONE => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20387
         | SOME cl =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20388
           case (if w then rewrite cl else SOME cl) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20389
             NONE => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20390
           | SOME cl =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20391
             let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20392
               val cl = if r then Metis_Clause.reduce units cl else cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20393
             in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20394
               if s andalso Metis_Clause.subsumes subs cl then NONE else SOME cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20395
             end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20396
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20397
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20398
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20399
val simplify = fn simp => fn units => fn rewr => fn subs => fn cl =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20400
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20401
      fun traceCl s = Metis_Print.trace Metis_Clause.pp ("Metis_Active.simplify: " ^ s)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20402
(*MetisTrace4
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20403
      val ppClOpt = Metis_Print.ppOption Metis_Clause.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20404
      val () = traceCl "cl" cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20405
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20406
      val cl' = simplify simp units rewr subs cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20407
(*MetisTrace4
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20408
      val () = Metis_Print.trace ppClOpt "Metis_Active.simplify: cl'" cl'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20409
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20410
      val () =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20411
          case cl' of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20412
            NONE => ()
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20413
          | SOME cl' =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20414
            case
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20415
              (case simplify simp units rewr subs cl' of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20416
                 NONE => SOME ("away", K ())
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20417
               | SOME cl'' =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20418
                 if Metis_Clause.equalThms cl' cl'' then NONE
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20419
                 else SOME ("further", fn () => traceCl "cl''" cl'')) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20420
              NONE => ()
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20421
            | SOME (e,f) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20422
              let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20423
                val () = traceCl "cl" cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20424
                val () = traceCl "cl'" cl'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20425
                val () = f ()
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20426
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20427
                raise
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20428
                  Bug
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20429
                    ("Metis_Active.simplify: clause should have been simplified "^e)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20430
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20431
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20432
      cl'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20433
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20434
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20435
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20436
fun simplifyActive simp active =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20437
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20438
      val Metis_Active {units,rewrite,subsume,...} = active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20439
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20440
      simplify simp units rewrite subsume
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20441
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20443
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20444
(* Add a clause into the active set.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20445
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20446
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20447
fun addUnit units cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20448
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20449
      val th = Metis_Clause.thm cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20450
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20451
      case total Metis_Thm.destUnit th of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20452
        SOME lit => Metis_Units.add units (lit,th)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20453
      | NONE => units
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20454
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20455
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20456
fun addRewrite rewrite cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20457
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20458
      val th = Metis_Clause.thm cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20459
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20460
      case total Metis_Thm.destUnitEq th of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20461
        SOME l_r => Metis_Rewrite.add rewrite (Metis_Clause.id cl, (l_r,th))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20462
      | NONE => rewrite
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20463
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20464
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20465
fun addSubsume subsume cl = Metis_Subsume.insert subsume (Metis_Clause.literals cl, cl);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20466
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20467
fun addLiterals literals cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20468
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20469
      fun add (lit as (_,atm), literals) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20470
          if Metis_Atom.isEq atm then literals
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20471
          else Metis_LiteralNet.insert literals (lit,(cl,lit))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20472
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20473
      Metis_LiteralSet.foldl add literals (Metis_Clause.largestLiterals cl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20474
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20475
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20476
fun addEquations equations cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20477
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20478
      fun add ((lit,ort,tm),equations) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20479
          Metis_TermNet.insert equations (tm,(cl,lit,ort,tm))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20480
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20481
      List.foldl add equations (Metis_Clause.largestEquations cl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20482
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20483
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20484
fun addSubterms subterms cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20485
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20486
      fun add ((lit,path,tm),subterms) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20487
          Metis_TermNet.insert subterms (tm,(cl,lit,path,tm))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20488
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20489
      List.foldl add subterms (Metis_Clause.largestSubterms cl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20490
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20491
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20492
fun addAllSubterms allSubterms cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20493
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20494
      fun add ((_,_,tm),allSubterms) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20495
          Metis_TermNet.insert allSubterms (tm,(cl,tm))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20496
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20497
      List.foldl add allSubterms (Metis_Clause.allSubterms cl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20498
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20499
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20500
fun addClause active cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20501
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20502
      val Metis_Active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20503
            {parameters,clauses,units,rewrite,subsume,literals,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20504
             equations,subterms,allSubterms} = active
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20505
      val clauses = Metis_IntMap.insert clauses (Metis_Clause.id cl, cl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20506
      and subsume = addSubsume subsume cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20507
      and literals = addLiterals literals cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20508
      and equations = addEquations equations cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20509
      and subterms = addSubterms subterms cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20510
      and allSubterms = addAllSubterms allSubterms cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20511
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20512
      Metis_Active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20513
        {parameters = parameters, clauses = clauses, units = units,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20514
         rewrite = rewrite, subsume = subsume, literals = literals,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20515
         equations = equations, subterms = subterms,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20516
         allSubterms = allSubterms}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20517
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20518
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20519
fun addFactorClause active cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20520
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20521
      val Metis_Active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20522
            {parameters,clauses,units,rewrite,subsume,literals,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20523
             equations,subterms,allSubterms} = active
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20524
      val units = addUnit units cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20525
      and rewrite = addRewrite rewrite cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20526
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20527
      Metis_Active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20528
        {parameters = parameters, clauses = clauses, units = units,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20529
         rewrite = rewrite, subsume = subsume, literals = literals,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20530
         equations = equations, subterms = subterms, allSubterms = allSubterms}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20531
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20532
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20533
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20534
(* Derive (unfactored) consequences of a clause.                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20535
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20536
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 20537
fun deduceResolution literals cl (lit as (_,atm), acc) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20538
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20539
      fun resolve (cl_lit,acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20540
          case total (Metis_Clause.resolve cl_lit) (cl,lit) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20541
            SOME cl' => cl' :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20542
          | NONE => acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20543
(*MetisTrace4
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20544
      val () = Metis_Print.trace Metis_Literal.pp "Metis_Active.deduceResolution: lit" lit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20545
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20546
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20547
      if Metis_Atom.isEq atm then acc
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20548
      else
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20549
        List.foldl resolve acc (Metis_LiteralNet.unify literals (Metis_Literal.negate lit))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20550
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20551
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20552
fun deduceParamodulationWith subterms cl ((lit,ort,tm),acc) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20553
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20554
      fun para (cl_lit_path_tm,acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20555
          case total (Metis_Clause.paramodulate (cl,lit,ort,tm)) cl_lit_path_tm of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20556
            SOME cl' => cl' :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20557
          | NONE => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20558
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20559
      List.foldl para acc (Metis_TermNet.unify subterms tm)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20560
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20561
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20562
fun deduceParamodulationInto equations cl ((lit,path,tm),acc) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20563
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20564
      fun para (cl_lit_ort_tm,acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20565
          case total (Metis_Clause.paramodulate cl_lit_ort_tm) (cl,lit,path,tm) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20566
            SOME cl' => cl' :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20567
          | NONE => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20568
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20569
      List.foldl para acc (Metis_TermNet.unify equations tm)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20570
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20571
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20572
fun deduce active cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20573
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20574
      val Metis_Active {parameters,literals,equations,subterms,...} = active
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20575
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20576
      val lits = Metis_Clause.largestLiterals cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20577
      val eqns = Metis_Clause.largestEquations cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20578
      val subtms =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20579
          if Metis_TermNet.null equations then [] else Metis_Clause.largestSubterms cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20580
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20581
      val () = Metis_Print.trace Metis_LiteralSet.pp "Metis_Active.deduce: lits" lits
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20582
      val () = Metis_Print.trace
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20583
                 (Metis_Print.ppList
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20584
                    (Metis_Print.ppMap (fn (lit,ort,_) => (lit,ort))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20585
                      (Metis_Print.ppPair Metis_Literal.pp Metis_Rewrite.ppOrient)))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20586
                 "Metis_Active.deduce: eqns" eqns
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20587
      val () = Metis_Print.trace
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20588
                 (Metis_Print.ppList
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20589
                    (Metis_Print.ppTriple Metis_Literal.pp Metis_Term.ppPath Metis_Term.pp))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20590
                 "Metis_Active.deduce: subtms" subtms
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20591
*)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20592
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20593
      val acc = []
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20594
      val acc = Metis_LiteralSet.foldl (deduceResolution literals cl) acc lits
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20595
      val acc = List.foldl (deduceParamodulationWith subterms cl) acc eqns
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20596
      val acc = List.foldl (deduceParamodulationInto equations cl) acc subtms
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 20597
      val acc = List.rev acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20598
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20599
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20600
      val () = Metis_Print.trace (Metis_Print.ppList Metis_Clause.pp) "Metis_Active.deduce: acc" acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20601
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20602
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20603
      acc
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20604
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20605
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20606
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20607
(* Extract clauses from the active set that can be simplified.               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20608
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20609
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20610
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20611
  fun clause_rewritables active =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20612
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20613
        val Metis_Active {clauses,rewrite,...} = active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20614
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20615
        fun rewr (id,cl,ids) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20616
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20617
              val cl' = Metis_Clause.rewrite rewrite cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20618
            in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20619
              if Metis_Clause.equalThms cl cl' then ids else Metis_IntSet.add ids id
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20620
            end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20621
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20622
        Metis_IntMap.foldr rewr Metis_IntSet.empty clauses
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20623
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20624
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20625
  fun orderedRedexResidues (((l,r),_),ort) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20626
      case ort of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20627
        NONE => []
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20628
      | SOME Metis_Rewrite.LeftToRight => [(l,r,true)]
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20629
      | SOME Metis_Rewrite.RightToLeft => [(r,l,true)];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20630
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20631
  fun unorderedRedexResidues (((l,r),_),ort) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20632
      case ort of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20633
        NONE => [(l,r,false),(r,l,false)]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20634
      | SOME _ => [];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20635
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20636
  fun rewrite_rewritables active rewr_ids =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20637
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20638
        val Metis_Active {parameters,rewrite,clauses,allSubterms,...} = active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20639
        val {clause = {ordering,...}, ...} = parameters
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20640
        val order = Metis_KnuthBendixOrder.compare ordering
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20641
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20642
        fun addRewr (id,acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20643
            if Metis_IntMap.inDomain id clauses then Metis_IntSet.add acc id else acc
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20644
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20645
        fun addReduce ((l,r,ord),acc) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20646
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20647
              fun isValidRewr tm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20648
                  case total (Metis_Subst.match Metis_Subst.empty l) tm of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20649
                    NONE => false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20650
                  | SOME sub =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20651
                    ord orelse
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20652
                    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20653
                      val tm' = Metis_Subst.subst (Metis_Subst.normalize sub) r
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20654
                    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20655
                      order (tm,tm') = SOME GREATER
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20656
                    end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20657
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20658
              fun addRed ((cl,tm),acc) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20659
                  let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20660
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20661
                    val () = Metis_Print.trace Metis_Clause.pp "Metis_Active.addRed: cl" cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20662
                    val () = Metis_Print.trace Metis_Term.pp "Metis_Active.addRed: tm" tm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20663
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20664
                    val id = Metis_Clause.id cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20665
                  in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20666
                    if Metis_IntSet.member id acc then acc
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20667
                    else if not (isValidRewr tm) then acc
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20668
                    else Metis_IntSet.add acc id
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20669
                  end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20670
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20671
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20672
              val () = Metis_Print.trace Metis_Term.pp "Metis_Active.addReduce: l" l
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20673
              val () = Metis_Print.trace Metis_Term.pp "Metis_Active.addReduce: r" r
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20674
              val () = Metis_Print.trace Metis_Print.ppBool "Metis_Active.addReduce: ord" ord
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20675
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20676
            in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20677
              List.foldl addRed acc (Metis_TermNet.matched allSubterms l)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20678
            end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20679
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20680
        fun addEquation redexResidues (id,acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20681
            case Metis_Rewrite.peek rewrite id of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20682
              NONE => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20683
            | SOME eqn_ort => List.foldl addReduce acc (redexResidues eqn_ort)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20684
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20685
        val addOrdered = addEquation orderedRedexResidues
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20686
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20687
        val addUnordered = addEquation unorderedRedexResidues
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20688
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20689
        val ids = Metis_IntSet.empty
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20690
        val ids = List.foldl addRewr ids rewr_ids
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20691
        val ids = List.foldl addOrdered ids rewr_ids
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20692
        val ids = List.foldl addUnordered ids rewr_ids
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20693
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20694
        ids
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20695
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20696
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20697
  fun choose_clause_rewritables active ids = size active <= length ids
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20698
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20699
  fun rewritables active ids =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20700
      if choose_clause_rewritables active ids then clause_rewritables active
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20701
      else rewrite_rewritables active ids;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20702
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20703
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20704
  val rewritables = fn active => fn ids =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20705
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20706
        val clause_ids = clause_rewritables active
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20707
        val rewrite_ids = rewrite_rewritables active ids
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20708
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20709
        val () =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20710
            if Metis_IntSet.equal rewrite_ids clause_ids then ()
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20711
            else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20712
              let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20713
                val ppIdl = Metis_Print.ppList Metis_Print.ppInt
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20714
                val ppIds = Metis_Print.ppMap Metis_IntSet.toList ppIdl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20715
                val () = Metis_Print.trace pp "Metis_Active.rewritables: active" active
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20716
                val () = Metis_Print.trace ppIdl "Metis_Active.rewritables: ids" ids
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20717
                val () = Metis_Print.trace ppIds
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20718
                           "Metis_Active.rewritables: clause_ids" clause_ids
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20719
                val () = Metis_Print.trace ppIds
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20720
                           "Metis_Active.rewritables: rewrite_ids" rewrite_ids
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20721
              in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20722
                raise Bug "Metis_Active.rewritables: ~(rewrite_ids SUBSET clause_ids)"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20723
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20724
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20725
        if choose_clause_rewritables active ids then clause_ids else rewrite_ids
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20726
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20727
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20728
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20729
  fun delete active ids =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20730
      if Metis_IntSet.null ids then active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20731
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20732
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20733
          fun idPred id = not (Metis_IntSet.member id ids)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20734
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20735
          fun clausePred cl = idPred (Metis_Clause.id cl)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20736
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20737
          val Metis_Active
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20738
                {parameters,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20739
                 clauses,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20740
                 units,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20741
                 rewrite,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20742
                 subsume,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20743
                 literals,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20744
                 equations,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20745
                 subterms,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20746
                 allSubterms} = active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20747
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20748
          val clauses = Metis_IntMap.filter (idPred o fst) clauses
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20749
          and subsume = Metis_Subsume.filter clausePred subsume
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20750
          and literals = Metis_LiteralNet.filter (clausePred o #1) literals
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20751
          and equations = Metis_TermNet.filter (clausePred o #1) equations
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20752
          and subterms = Metis_TermNet.filter (clausePred o #1) subterms
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20753
          and allSubterms = Metis_TermNet.filter (clausePred o fst) allSubterms
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20754
        in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20755
          Metis_Active
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20756
            {parameters = parameters,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20757
             clauses = clauses,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20758
             units = units,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20759
             rewrite = rewrite,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20760
             subsume = subsume,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20761
             literals = literals,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20762
             equations = equations,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20763
             subterms = subterms,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20764
             allSubterms = allSubterms}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20765
        end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20766
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20767
  fun extract_rewritables (active as Metis_Active {clauses,rewrite,...}) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20768
      if Metis_Rewrite.isReduced rewrite then (active,[])
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20769
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20770
        let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20771
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20772
          val () = trace "Metis_Active.extract_rewritables: inter-reducing\n"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20773
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20774
          val (rewrite,ids) = Metis_Rewrite.reduce' rewrite
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20775
          val active = setRewrite active rewrite
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20776
          val ids = rewritables active ids
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20777
          val cls = Metis_IntSet.transform (Metis_IntMap.get clauses) ids
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20778
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20779
          val ppCls = Metis_Print.ppList Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20780
          val () = Metis_Print.trace ppCls "Metis_Active.extract_rewritables: cls" cls
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20781
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20782
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20783
          (delete active ids, cls)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20784
        end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20785
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20786
        handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20787
          raise Bug ("Metis_Active.extract_rewritables: shouldn't fail\n" ^ err);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20788
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20789
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20790
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20791
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20792
(* Factor clauses.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20793
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20794
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20795
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20796
  fun prefactor_simplify active subsume =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20797
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20798
        val Metis_Active {parameters,units,rewrite,...} = active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20799
        val {prefactor,...} = parameters
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20800
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20801
        simplify prefactor units rewrite subsume
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20802
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20803
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20804
  fun postfactor_simplify active subsume =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20805
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20806
        val Metis_Active {parameters,units,rewrite,...} = active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20807
        val {postfactor,...} = parameters
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20808
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20809
        simplify postfactor units rewrite subsume
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20810
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20811
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20812
  val sort_utilitywise =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20813
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20814
        fun utility cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20815
            case Metis_LiteralSet.size (Metis_Clause.literals cl) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20816
              0 => ~1
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20817
            | 1 => if Metis_Thm.isUnitEq (Metis_Clause.thm cl) then 0 else 1
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20818
            | n => n
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20819
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20820
        sortMap utility Int.compare
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20821
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20822
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20823
  fun factor_add (cl, active_subsume_acc as (active,subsume,acc)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20824
      case postfactor_simplify active subsume cl of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20825
        NONE => active_subsume_acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20826
      | SOME cl =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20827
        let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20828
          val active = addFactorClause active cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20829
          and subsume = addSubsume subsume cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20830
          and acc = cl :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20831
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20832
          (active,subsume,acc)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20833
        end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20834
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20835
  fun factor1 (cl, active_subsume_acc as (active,subsume,_)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20836
      case prefactor_simplify active subsume cl of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20837
        NONE => active_subsume_acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20838
      | SOME cl =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20839
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20840
          val cls = sort_utilitywise (cl :: Metis_Clause.factor cl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20841
        in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20842
          List.foldl factor_add active_subsume_acc cls
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20843
        end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20844
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 20845
  fun factor' active acc [] = (active, List.rev acc)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20846
    | factor' active acc cls =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20847
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20848
        val cls = sort_utilitywise cls
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20849
        val subsume = getSubsume active
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20850
        val (active,_,acc) = List.foldl factor1 (active,subsume,acc) cls
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20851
        val (active,cls) = extract_rewritables active
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20852
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20853
        factor' active acc cls
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20854
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20855
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20856
  fun factor active cls = factor' active [] cls;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20857
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20858
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20859
(*MetisTrace4
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20860
val factor = fn active => fn cls =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20861
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20862
      val ppCls = Metis_Print.ppList Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20863
      val () = Metis_Print.trace ppCls "Metis_Active.factor: cls" cls
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20864
      val (active,cls') = factor active cls
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20865
      val () = Metis_Print.trace ppCls "Metis_Active.factor: cls'" cls'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20866
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20867
      (active,cls')
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20868
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20869
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20870
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20871
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20872
(* Create a new active clause set and initialize clauses.                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20873
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20874
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20875
fun new parameters {axioms,conjecture} =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20876
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20877
      val {clause,...} = parameters
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20878
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20879
      fun mk_clause th =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20880
          Metis_Clause.mk {parameters = clause, id = Metis_Clause.newId (), thm = th}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20881
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20882
      val active = empty parameters
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 20883
      val (active,axioms) = factor active (List.map mk_clause axioms)
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 20884
      val (active,conjecture) = factor active (List.map mk_clause conjecture)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20885
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20886
      (active, {axioms = axioms, conjecture = conjecture})
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20887
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20888
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20889
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20890
(* Add a clause into the active set and deduce all consequences.             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20891
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20892
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20893
fun add active cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20894
    case simplifyActive maxSimplify active cl of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20895
      NONE => (active,[])
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20896
    | SOME cl' =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20897
      if Metis_Clause.isContradiction cl' then (active,[cl'])
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20898
      else if not (Metis_Clause.equalThms cl cl') then factor active [cl']
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20899
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20900
        let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20901
(*MetisTrace2
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20902
          val () = Metis_Print.trace Metis_Clause.pp "Metis_Active.add: cl" cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20903
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20904
          val active = addClause active cl
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20905
          val cl = Metis_Clause.freshVars cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20906
          val cls = deduce active cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20907
          val (active,cls) = factor active cls
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20908
(*MetisTrace2
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20909
          val ppCls = Metis_Print.ppList Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20910
          val () = Metis_Print.trace ppCls "Metis_Active.add: cls" cls
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20911
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20912
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20913
          (active,cls)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20914
        end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20915
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20916
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20917
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20918
(**** Original file: src/Waiting.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20919
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20920
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20921
(* THE WAITING SET OF CLAUSES                                                *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20922
(* Copyright (c) 2002 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20923
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20924
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20925
signature Metis_Waiting =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20926
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20927
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20928
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20929
(* The parameters control the order that clauses are removed from the        *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20930
(* waiting set: clauses are assigned a weight and removed in strict weight   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20931
(* order, with smaller weights being removed before larger weights.          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20932
(*                                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20933
(* The weight of a clause is defined to be                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20934
(*                                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20935
(*   d * s^symbolsWeight * v^variablesWeight * l^literalsWeight * m          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20936
(*                                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20937
(* where                                                                     *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20938
(*                                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20939
(*   d = the derivation distance of the clause from the axioms               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20940
(*   s = the number of symbols in the clause                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20941
(*   v = the number of distinct variables in the clause                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20942
(*   l = the number of literals in the clause                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20943
(*   m = the truth of the clause wrt the models                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20944
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20945
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20946
type weight = real
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20947
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20948
type modelParameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20949
     {model : Metis_Model.parameters,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20950
      initialPerturbations : int,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20951
      maxChecks : int option,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20952
      perturbations : int,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20953
      weight : weight}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20954
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20955
type parameters =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20956
     {symbolsWeight : weight,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20957
      variablesWeight : weight,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20958
      literalsWeight : weight,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20959
      models : modelParameters list}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20960
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20961
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20962
(* A type of waiting sets of clauses.                                        *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20963
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20964
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20965
type waiting
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20966
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20967
type distance
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20968
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20969
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20970
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20971
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20972
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20973
val default : parameters
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20974
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20975
val new :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20976
    parameters ->
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20977
    {axioms : Metis_Clause.clause list,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20978
     conjecture : Metis_Clause.clause list} -> waiting
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20979
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20980
val size : waiting -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20981
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20982
val pp : waiting Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20983
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20984
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20985
(* Adding new clauses.                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20986
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20987
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20988
val add : waiting -> distance * Metis_Clause.clause list -> waiting
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20989
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20990
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20991
(* Removing the lightest clause.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20992
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20993
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20994
val remove : waiting -> ((distance * Metis_Clause.clause) * waiting) option
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20995
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20996
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20997
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20998
(**** Original file: src/Waiting.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20999
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21000
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21001
(* THE WAITING SET OF CLAUSES                                                *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21002
(* Copyright (c) 2002 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21003
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21004
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21005
structure Metis_Waiting :> Metis_Waiting =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21006
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21007
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21008
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21009
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21010
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21011
(* A type of waiting sets of clauses.                                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21012
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21013
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21014
type weight = real;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21015
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21016
type modelParameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21017
     {model : Metis_Model.parameters,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21018
      initialPerturbations : int,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21019
      maxChecks : int option,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21020
      perturbations : int,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21021
      weight : weight}
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 21022
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21023
type parameters =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21024
     {symbolsWeight : weight,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21025
      variablesWeight : weight,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21026
      literalsWeight : weight,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21027
      models : modelParameters list};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21028
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21029
type distance = real;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21030
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21031
datatype waiting =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21032
    Metis_Waiting of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21033
      {parameters : parameters,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21034
       clauses : (weight * (distance * Metis_Clause.clause)) Metis_Heap.heap,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21035
       models : Metis_Model.model list};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21036
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21037
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21038
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21039
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21040
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21041
val defaultModels : modelParameters list =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21042
    [{model = Metis_Model.default,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21043
      initialPerturbations = 100,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21044
      maxChecks = SOME 20,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21045
      perturbations = 0,
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21046
      weight = 1.0}];
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21047
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21048
val default : parameters =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21049
     {symbolsWeight = 1.0,
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21050
      literalsWeight = 1.0,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21051
      variablesWeight = 1.0,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21052
      models = defaultModels};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21053
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21054
fun size (Metis_Waiting {clauses,...}) = Metis_Heap.size clauses;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21055
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21056
val pp =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21057
    Metis_Print.ppMap
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21058
      (fn w => "Metis_Waiting{" ^ Int.toString (size w) ^ "}")
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21059
      Metis_Print.ppString;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21060
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21061
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21062
val pp =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21063
    Metis_Print.ppMap
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21064
      (fn Metis_Waiting {clauses,...} =>
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21065
          List.map (fn (w,(_,cl)) => (w, Metis_Clause.id cl, cl)) (Metis_Heap.toList clauses))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21066
      (Metis_Print.ppList (Metis_Print.ppTriple Metis_Print.ppReal Metis_Print.ppInt Metis_Clause.pp));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21067
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21068
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21069
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21070
(* Perturbing the models.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21071
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21072
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21073
type modelClause = Metis_NameSet.set * Metis_Thm.clause;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21074
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21075
fun mkModelClause cl =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21076
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21077
      val lits = Metis_Clause.literals cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21078
      val fvs = Metis_LiteralSet.freeVars lits
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21079
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21080
      (fvs,lits)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21081
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21082
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21083
val mkModelClauses = List.map mkModelClause;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21084
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21085
fun perturbModel M cls =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21086
    if List.null cls then K ()
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21087
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21088
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21089
        val N = {size = Metis_Model.size M}
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21090
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21091
        fun perturbClause (fv,cl) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21092
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21093
              val V = Metis_Model.randomValuation N fv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21094
            in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21095
              if Metis_Model.interpretClause M V cl then ()
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21096
              else Metis_Model.perturbClause M V cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21097
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21098
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21099
        fun perturbClauses () = app perturbClause cls
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21100
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21101
        fn n => funpow n perturbClauses ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21102
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21103
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21104
fun initialModel axioms conjecture parm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21105
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21106
      val {model,initialPerturbations,...} : modelParameters = parm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21107
      val m = Metis_Model.new model
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21108
      val () = perturbModel m conjecture initialPerturbations
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21109
      val () = perturbModel m axioms initialPerturbations
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21110
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21111
      m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21112
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21113
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21114
fun checkModels parms models (fv,cl) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21115
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21116
      fun check ((parm,model),z) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21117
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21118
            val {maxChecks,weight,...} : modelParameters = parm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21119
            val n = {maxChecks = maxChecks}
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21120
            val {T,F} = Metis_Model.check Metis_Model.interpretClause n model fv cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21121
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21122
            Math.pow (1.0 + Real.fromInt T / Real.fromInt (T + F), weight) * z
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21123
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21124
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21125
      List.foldl check 1.0 (zip parms models)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21126
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21127
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21128
fun perturbModels parms models cls =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21129
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21130
      fun perturb (parm,model) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21131
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21132
            val {perturbations,...} : modelParameters = parm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21133
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21134
            perturbModel model cls perturbations
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21135
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21136
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21137
      app perturb (zip parms models)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21138
    end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21139
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21140
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21141
(* Metis_Clause weights.                                                           *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21142
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21143
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21144
local
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21145
  fun clauseSymbols cl = Real.fromInt (Metis_LiteralSet.typedSymbols cl);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21146
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21147
  fun clauseVariables cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21148
      Real.fromInt (Metis_NameSet.size (Metis_LiteralSet.freeVars cl) + 1);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21149
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21150
  fun clauseLiterals cl = Real.fromInt (Metis_LiteralSet.size cl);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21151
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21152
  fun clausePriority cl = 1e~12 * Real.fromInt (Metis_Clause.id cl);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21153
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21154
  fun clauseWeight (parm : parameters) mods dist mcl cl =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21155
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21156
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21157
        val () = Metis_Print.trace Metis_Clause.pp "Metis_Waiting.clauseWeight: cl" cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21158
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21159
        val {symbolsWeight,variablesWeight,literalsWeight,models,...} = parm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21160
        val lits = Metis_Clause.literals cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21161
        val symbolsW = Math.pow (clauseSymbols lits, symbolsWeight)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21162
        val variablesW = Math.pow (clauseVariables lits, variablesWeight)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21163
        val literalsW = Math.pow (clauseLiterals lits, literalsWeight)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21164
        val modelsW = checkModels models mods mcl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21165
(*MetisTrace4
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21166
        val () = trace ("Metis_Waiting.clauseWeight: dist = " ^
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21167
                        Real.toString dist ^ "\n")
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21168
        val () = trace ("Metis_Waiting.clauseWeight: symbolsW = " ^
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21169
                        Real.toString symbolsW ^ "\n")
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21170
        val () = trace ("Metis_Waiting.clauseWeight: variablesW = " ^
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21171
                        Real.toString variablesW ^ "\n")
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21172
        val () = trace ("Metis_Waiting.clauseWeight: literalsW = " ^
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21173
                        Real.toString literalsW ^ "\n")
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21174
        val () = trace ("Metis_Waiting.clauseWeight: modelsW = " ^
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21175
                        Real.toString modelsW ^ "\n")
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21176
*)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21177
        val weight = dist * symbolsW * variablesW * literalsW * modelsW
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21178
        val weight = weight + clausePriority cl
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21179
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21180
        val () = trace ("Metis_Waiting.clauseWeight: weight = " ^
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21181
                        Real.toString weight ^ "\n")
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21182
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21183
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21184
        weight
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21185
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21186
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21187
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21188
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21189
(* Adding new clauses.                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21190
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21191
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21192
fun add' waiting dist mcls cls =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21193
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21194
      val Metis_Waiting {parameters,clauses,models} = waiting
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21195
      val {models = modelParameters, ...} = parameters
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21196
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21197
(*MetisDebug
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21198
      val _ = not (List.null cls) orelse
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21199
              raise Bug "Metis_Waiting.add': null"
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21200
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21201
      val _ = length mcls = length cls orelse
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21202
              raise Bug "Metis_Waiting.add': different lengths"
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21203
*)
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21204
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21205
      val dist = dist + Math.ln (Real.fromInt (length cls))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21206
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21207
      fun addCl ((mcl,cl),acc) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21208
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21209
            val weight = clauseWeight parameters models dist mcl cl
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21210
          in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21211
            Metis_Heap.add acc (weight,(dist,cl))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21212
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21213
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21214
      val clauses = List.foldl addCl clauses (zip mcls cls)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21215
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21216
      val () = perturbModels modelParameters models mcls
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21217
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21218
      Metis_Waiting {parameters = parameters, clauses = clauses, models = models}
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21219
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21220
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21221
fun add waiting (dist,cls) =
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21222
    if List.null cls then waiting
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21223
    else
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21224
      let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21225
(*MetisTrace3
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21226
        val () = Metis_Print.trace pp "Metis_Waiting.add: waiting" waiting
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21227
        val () = Metis_Print.trace (Metis_Print.ppList Metis_Clause.pp) "Metis_Waiting.add: cls" cls
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21228
*)
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21229
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21230
        val waiting = add' waiting dist (mkModelClauses cls) cls
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21231
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21232
(*MetisTrace3
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21233
        val () = Metis_Print.trace pp "Metis_Waiting.add: waiting" waiting
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21234
*)
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21235
      in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21236
        waiting
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21237
      end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21238
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21239
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21240
  fun cmp ((w1,_),(w2,_)) = Real.compare (w1,w2);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21241
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21242
  fun empty parameters axioms conjecture =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21243
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21244
        val {models = modelParameters, ...} = parameters
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21245
        val clauses = Metis_Heap.new cmp
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21246
        and models = List.map (initialModel axioms conjecture) modelParameters
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21247
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21248
        Metis_Waiting {parameters = parameters, clauses = clauses, models = models}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21249
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21250
in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21251
  fun new parameters {axioms,conjecture} =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21252
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21253
        val mAxioms = mkModelClauses axioms
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21254
        and mConjecture = mkModelClauses conjecture
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21255
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21256
        val waiting = empty parameters mAxioms mConjecture
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21257
      in
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21258
        if List.null axioms andalso List.null conjecture then waiting
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21259
        else add' waiting 0.0 (mAxioms @ mConjecture) (axioms @ conjecture)
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21260
      end
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21261
(*MetisDebug
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21262
      handle e =>
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21263
        let
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21264
          val () = Metis_Print.trace Metis_Print.ppException "Metis_Waiting.new: exception" e
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21265
        in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21266
          raise e
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21267
        end;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21268
*)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21269
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21270
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21271
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21272
(* Removing the lightest clause.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21273
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21274
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21275
fun remove (Metis_Waiting {parameters,clauses,models}) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21276
    if Metis_Heap.null clauses then NONE
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21277
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21278
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21279
        val ((_,dcl),clauses) = Metis_Heap.remove clauses
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21280
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21281
        val waiting =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21282
            Metis_Waiting
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21283
              {parameters = parameters,
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21284
               clauses = clauses,
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21285
               models = models}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21286
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21287
        SOME (dcl,waiting)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21288
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21289
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21290
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21291
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21292
(**** Original file: src/Resolution.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21293
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21294
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21295
(* THE RESOLUTION PROOF PROCEDURE                                            *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21296
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21297
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21298
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21299
signature Metis_Resolution =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21300
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21301
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21302
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21303
(* A type of resolution proof procedures.                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21304
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21305
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21306
type parameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21307
     {active : Metis_Active.parameters,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21308
      waiting : Metis_Waiting.parameters}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21309
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21310
type resolution
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21311
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21312
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21313
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21314
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21315
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21316
val default : parameters
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21317
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21318
val new :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21319
    parameters -> {axioms : Metis_Thm.thm list, conjecture : Metis_Thm.thm list} ->
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21320
    resolution
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21321
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21322
val active : resolution -> Metis_Active.active
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21323
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21324
val waiting : resolution -> Metis_Waiting.waiting
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21325
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21326
val pp : resolution Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21327
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21328
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21329
(* The main proof loop.                                                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21330
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21331
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21332
datatype decision =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21333
    Contradiction of Metis_Thm.thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21334
  | Satisfiable of Metis_Thm.thm list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21335
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21336
datatype state =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21337
    Decided of decision
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21338
  | Undecided of resolution
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21339
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21340
val iterate : resolution -> state
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21341
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21342
val loop : resolution -> decision
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21343
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21344
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21345
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21346
(**** Original file: src/Resolution.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21347
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21348
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21349
(* THE RESOLUTION PROOF PROCEDURE                                            *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21350
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21351
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21352
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21353
structure Metis_Resolution :> Metis_Resolution =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21354
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21355
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21356
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21357
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21358
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21359
(* A type of resolution proof procedures.                                    *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21360
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21361
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21362
type parameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21363
     {active : Metis_Active.parameters,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21364
      waiting : Metis_Waiting.parameters};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21365
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21366
datatype resolution =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21367
    Metis_Resolution of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21368
      {parameters : parameters,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21369
       active : Metis_Active.active,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21370
       waiting : Metis_Waiting.waiting};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21371
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21372
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21373
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21374
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21375
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21376
val default : parameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21377
    {active = Metis_Active.default,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21378
     waiting = Metis_Waiting.default};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21379
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21380
fun new parameters ths =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21381
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21382
      val {active = activeParm, waiting = waitingParm} = parameters
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21383
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21384
      val (active,cls) = Metis_Active.new activeParm ths  (* cls = factored ths *)
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21385
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21386
      val waiting = Metis_Waiting.new waitingParm cls
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21387
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21388
      Metis_Resolution {parameters = parameters, active = active, waiting = waiting}
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21389
    end
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21390
(*MetisDebug
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21391
    handle e =>
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21392
      let
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21393
        val () = Metis_Print.trace Metis_Print.ppException "Metis_Resolution.new: exception" e
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21394
      in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21395
        raise e
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21396
      end;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21397
*)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21398
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21399
fun active (Metis_Resolution {active = a, ...}) = a;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21400
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21401
fun waiting (Metis_Resolution {waiting = w, ...}) = w;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21402
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21403
val pp =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21404
    Metis_Print.ppMap
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21405
      (fn Metis_Resolution {active,waiting,...} =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21406
          "Metis_Resolution(" ^ Int.toString (Metis_Active.size active) ^
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21407
          "<-" ^ Int.toString (Metis_Waiting.size waiting) ^ ")")
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21408
      Metis_Print.ppString;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21409
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21410
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21411
(* The main proof loop.                                                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21412
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21413
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21414
datatype decision =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21415
    Contradiction of Metis_Thm.thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21416
  | Satisfiable of Metis_Thm.thm list;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21417
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21418
datatype state =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21419
    Decided of decision
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21420
  | Undecided of resolution;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21421
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21422
fun iterate res =
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21423
    let
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21424
      val Metis_Resolution {parameters,active,waiting} = res
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21425
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21426
(*MetisTrace2
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21427
      val () = Metis_Print.trace Metis_Active.pp "Metis_Resolution.iterate: active" active
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21428
      val () = Metis_Print.trace Metis_Waiting.pp "Metis_Resolution.iterate: waiting" waiting
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21429
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21430
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21431
      case Metis_Waiting.remove waiting of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21432
        NONE =>
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21433
        let
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21434
          val sat = Satisfiable (List.map Metis_Clause.thm (Metis_Active.saturation active))
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21435
        in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21436
          Decided sat
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21437
        end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21438
      | SOME ((d,cl),waiting) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21439
        if Metis_Clause.isContradiction cl then
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21440
          Decided (Contradiction (Metis_Clause.thm cl))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21441
        else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21442
          let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21443
(*MetisTrace1
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21444
            val () = Metis_Print.trace Metis_Clause.pp "Metis_Resolution.iterate: cl" cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21445
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21446
            val (active,cls) = Metis_Active.add active cl
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21447
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21448
            val waiting = Metis_Waiting.add waiting (d,cls)
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21449
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21450
            val res =
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21451
                Metis_Resolution
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21452
                  {parameters = parameters,
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21453
                   active = active,
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21454
                   waiting = waiting}
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21455
          in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21456
            Undecided res
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21457
          end
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21458
    end;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21459
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21460
fun loop res =
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21461
    case iterate res of
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21462
      Decided dec => dec
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21463
    | Undecided res => loop res;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21464
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21465
end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21466
;