src/Tools/Metis/metis.ML
author wenzelm
Mon, 29 Aug 2022 19:26:27 +0200
changeset 76019 f3d8da992445
parent 74358 6ab3116a251a
child 78650 47d0c333d155
permissions -rw-r--r--
provide cvc5-1.0.2 (inactive);
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
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
     3
   with Joe Leslie-Hurd's kind permission. Extract from a September 13, 2010
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
     4
   email written by him:
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                                            *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
    96
(* Copyright (c) 2001 Joe Leslie-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                                                      *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
   177
(* Copyright (c) 2001 Joe Leslie-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
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
   380
(* Primes *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
   381
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
   382
type sieve
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
   383
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
   384
val initSieve : sieve
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
   385
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
   386
val maxSieve : sieve -> int
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
   387
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
   388
val primesSieve : sieve -> int list
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
   389
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
   390
val incSieve : sieve -> bool * sieve
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
   391
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
   392
val nextSieve : sieve -> int * sieve
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
   393
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   394
val primes : int -> int list
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 primesUpTo : int -> int list
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   399
(* Strings.                                                                  *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   400
(* ------------------------------------------------------------------------- *)
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 rot : int -> char -> char
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   403
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   404
val charToInt : char -> int option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   405
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   406
val charFromInt : int -> char option
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 nChars : char -> int -> 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 chomp : string -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   411
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   412
val trim : string -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   413
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   414
val join : string -> string list -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   415
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   416
val split : string -> string -> string list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   417
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   418
val capitalize : string -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   419
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   420
val mkPrefix : string -> string -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   421
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   422
val destPrefix : string -> string -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   423
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   424
val isPrefix : string -> string -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   425
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   426
val stripPrefix : (char -> bool) -> string -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   427
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   428
val mkSuffix : string -> string -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   429
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   430
val destSuffix : string -> string -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   431
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   432
val isSuffix : string -> string -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   433
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   434
val stripSuffix : (char -> bool) -> string -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   435
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   436
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   437
(* Tables.                                                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   438
(* ------------------------------------------------------------------------- *)
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
type columnAlignment = {leftAlign : bool, padChar : char}
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
val alignColumn : columnAlignment -> string list -> string list -> string list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   443
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   444
val alignTable : columnAlignment list -> string list list -> string list
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   447
(* Reals.                                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   448
(* ------------------------------------------------------------------------- *)
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 percentToString : real -> string
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 pos : real -> real
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 log2 : real -> real  (* Domain *)
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   457
(* Sum datatype.                                                             *)
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
datatype ('a,'b) sum = Left of 'a | Right of 'b
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 destLeft : ('a,'b) sum -> 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   463
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   464
val isLeft : ('a,'b) sum -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   465
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   466
val destRight : ('a,'b) sum -> 'b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   467
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   468
val isRight : ('a,'b) sum -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   469
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   470
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
   471
(* Metis_Useful impure features.                                                   *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   472
(* ------------------------------------------------------------------------- *)
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 newInt : unit -> int
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 newInts : int -> int list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   477
32740
9dd0a2f83429 explicit indication of Unsynchronized.ref;
wenzelm
parents: 30161
diff changeset
   478
val withRef : 'r Unsynchronized.ref * 'r -> ('a -> 'b) -> 'a -> 'b
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   479
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
   480
val cloneArray : 'a Array.array -> 'a Array.array
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   481
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   482
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   483
(* The environment.                                                          *)
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   486
val host : unit -> string
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 time : unit -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   489
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   490
val date : unit -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   491
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   492
val readDirectory : {directory : string} -> {filename : string} list
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 readTextFile : {filename : string} -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   495
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   496
val writeTextFile : {contents : string, filename : string} -> unit
23442
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   499
(* Profiling and error reporting.                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   500
(* ------------------------------------------------------------------------- *)
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 try : ('a -> 'b) -> 'a -> 'b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   503
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   504
val chat : string -> unit  (* stdout *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   505
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   506
val chide : string -> unit  (* stderr *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   507
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   508
val warn : string -> unit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   509
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   510
val die : string -> 'exit
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
val timed : ('a -> 'b) -> 'a -> real * 'b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   513
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   514
val timedMany : ('a -> 'b) -> 'a -> real * 'b
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
val executionTime : unit -> real  (* Wall clock execution time *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   517
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   518
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   519
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   520
(**** Original file: src/Useful.sml ****)
23442
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
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   523
(* ML UTILITY FUNCTIONS                                                      *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
   524
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   525
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   526
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
   527
structure Metis_Useful :> Metis_Useful =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   528
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   529
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   530
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   531
(* Exceptions.                                                               *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   532
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   533
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   534
exception Error of string;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   535
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   536
exception Bug of string;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   537
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   538
fun errorToStringOption 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
      Error message => SOME ("Error: " ^ 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 errorToStringOption;
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 errorToString err =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   548
    case errorToStringOption 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 "errorToString: not an Error exception";
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   551
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   552
fun bugToStringOption err =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   553
    case err of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   554
      Bug message => SOME ("Bug: " ^ message)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   555
    | _ => NONE;
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
(*mlton
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   558
val () = MLton.Exn.addExnMessager bugToStringOption;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   559
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   560
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   561
fun bugToString err =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   562
    case bugToStringOption err of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   563
      SOME s => "\n" ^ s ^ "\n"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   564
    | NONE => raise Bug "bugToString: not a Bug exception";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   565
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   566
fun total f x = SOME (f x) handle Error _ => NONE;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   567
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   568
fun can f = Option.isSome o total f;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   569
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   570
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   571
(* Tracing.                                                                  *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   572
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   573
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   574
local
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   575
  val traceOut = TextIO.stdOut;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   576
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   577
  fun tracePrintFn mesg =
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   578
      let
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   579
        val () = TextIO.output (traceOut,mesg)
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   580
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   581
        val () = TextIO.flushOut traceOut
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   582
      in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   583
        ()
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   584
      end;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   585
in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   586
  val tracePrint = Unsynchronized.ref tracePrintFn;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   587
end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   588
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   589
fun trace mesg = !tracePrint mesg;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   590
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   591
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   592
(* Combinators.                                                              *)
23442
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   595
fun C f x y = f y x;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   596
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   597
fun I x = x;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   598
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   599
fun K x y = x;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   600
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   601
fun S f g x = f x (g x);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   602
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   603
fun W f x = f x x;
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
fun funpow 0 _ x = x
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   606
  | funpow n f x = funpow (n - 1) f (f 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 exp m =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   609
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   610
      fun f _ 0 z = z
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   611
        | 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
   612
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   613
      f
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   614
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   615
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   616
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   617
(* Pairs.                                                                    *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   618
(* ------------------------------------------------------------------------- *)
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
fun fst (x,_) = x;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   621
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   622
fun snd (_,y) = y;
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
fun pair x y = (x,y);
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 swap (x,y) = (y,x);
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 curry f x y = f (x,y);
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 uncurry f (x,y) = f x y;
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
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
   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
(* State transformers.                                                       *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   636
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   637
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   638
val unit : 'a -> 's -> 'a * 's = pair;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   639
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   640
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
   641
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   642
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
   643
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   644
fun mjoin (f : 's -> ('s -> 'a * 's) * 's) = bind f I;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   645
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   646
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
   647
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   648
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   649
(* Equality.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   650
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   651
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   652
val equal = fn x => fn y => x = y;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   653
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   654
val notEqual = fn x => fn y => x <> y;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   655
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   656
fun listEqual xEq =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   657
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   658
      fun xsEq [] [] = true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   659
        | 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
   660
        | xsEq _ _ = false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   661
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   662
      xsEq
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   663
    end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   664
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
(* Comparisons.                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   667
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   668
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   669
fun mapCompare f cmp (a,b) = cmp (f a, f b);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   670
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   671
fun revCompare cmp x_y =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   672
    case cmp x_y of LESS => GREATER | EQUAL => EQUAL | GREATER => LESS;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   673
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   674
fun prodCompare xCmp yCmp ((x1,y1),(x2,y2)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   675
    case xCmp (x1,x2) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   676
      LESS => LESS
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   677
    | EQUAL => yCmp (y1,y2)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   678
    | GREATER => GREATER;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   679
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   680
fun lexCompare cmp =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   681
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   682
      fun lex ([],[]) = EQUAL
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   683
        | lex ([], _ :: _) = LESS
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   684
        | lex (_ :: _, []) = GREATER
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   685
        | lex (x :: xs, y :: ys) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   686
          case cmp (x,y) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   687
            LESS => LESS
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   688
          | EQUAL => lex (xs,ys)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   689
          | GREATER => GREATER
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   690
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   691
      lex
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   692
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   693
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   694
fun optionCompare _ (NONE,NONE) = EQUAL
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   695
  | optionCompare _ (NONE,_) = LESS
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   696
  | optionCompare _ (_,NONE) = GREATER
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   697
  | optionCompare cmp (SOME x, SOME y) = cmp (x,y);
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
   698
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   699
fun boolCompare (false,true) = LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   700
  | boolCompare (true,false) = GREATER
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   701
  | boolCompare _ = EQUAL;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   702
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   703
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   704
(* Lists.                                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   705
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   706
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   707
fun cons x y = x :: y;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   708
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   709
fun hdTl l = (hd l, tl l);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   710
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   711
fun append xs ys = xs @ ys;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   712
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   713
fun singleton a = [a];
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   714
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   715
fun first f [] = NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   716
  | 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
   717
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   718
fun maps (_ : 'a -> 's -> 'b * 's) [] = unit []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   719
  | maps f (x :: xs) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   720
    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
   721
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   722
fun mapsPartial (_ : 'a -> 's -> 'b option * 's) [] = unit []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   723
  | mapsPartial f (x :: xs) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   724
    bind
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   725
      (f x)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   726
      (fn yo =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   727
          bind
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   728
            (mapsPartial f xs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   729
            (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
   730
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   731
fun zipWith f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   732
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   733
      fun z l [] [] = l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   734
        | 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
   735
        | z _ _ _ = raise Error "zipWith: lists different lengths";
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   736
    in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   737
      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
   738
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   739
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   740
fun zip xs ys = zipWith pair xs ys;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   741
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   742
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   743
  fun inc ((x,y),(xs,ys)) = (x :: xs, y :: ys);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   744
in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   745
  fun unzip ab = List.foldl inc ([],[]) (List.rev ab);
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   746
end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   747
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   748
fun cartwith f =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   749
    let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   750
      fun aux _ res _ [] = res
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   751
        | aux xsCopy res [] (y :: yt) = aux xsCopy res xsCopy yt
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   752
        | aux xsCopy res (x :: xt) (ys as y :: _) =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   753
          aux xsCopy (f x y :: res) xt ys
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   754
    in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   755
      fn xs => fn ys =>
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   756
         let val xs' = List.rev xs in aux xs' [] xs' (List.rev ys) end
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   757
    end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   758
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   759
fun cart xs ys = cartwith pair xs ys;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   760
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   761
fun takeWhile p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   762
    let
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   763
      fun f acc [] = List.rev acc
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   764
        | 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
   765
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   766
      f []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   767
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   768
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   769
fun dropWhile p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   770
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   771
      fun f [] = []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   772
        | 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
   773
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   774
      f
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   775
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   776
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   777
fun divideWhile p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   778
    let
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   779
      fun f acc [] = (List.rev acc, [])
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   780
        | 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
   781
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   782
      f []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   783
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   784
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   785
fun groups f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   786
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   787
      fun group acc row x l =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   788
          case l of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   789
            [] =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   790
            let
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   791
              val acc = if List.null row then acc else List.rev row :: acc
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   792
            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   793
              List.rev acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   794
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   795
          | h :: t =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   796
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   797
              val (eor,x) = f (h,x)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   798
            in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   799
              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
   800
              else group acc (h :: row) x t
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
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   803
      group [] []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   804
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   805
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   806
fun groupsBy eq =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   807
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   808
      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
   809
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   810
      fn [] => []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   811
       | h :: t =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   812
         case groups f h t of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   813
           [] => [[h]]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   814
         | hs :: ts => (h :: hs) :: ts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   815
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   816
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   817
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   818
  fun fstEq ((x,_),(y,_)) = x = y;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   819
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   820
  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
   821
in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   822
  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
   823
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   824
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   825
fun groupsOf n =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   826
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   827
      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
   828
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   829
      groups f (n + 1)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   830
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   831
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   832
fun index p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   833
  let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   834
    fun idx _ [] = NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   835
      | 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
   836
  in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   837
    idx 0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   838
  end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   839
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   840
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
   841
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   842
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   843
  fun revDiv acc l 0 = (acc,l)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   844
    | revDiv _ [] _ = raise Subscript
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   845
    | 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
   846
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   847
  fun revDivide l = revDiv [] l;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   848
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   849
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   850
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
   851
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   852
fun updateNth (n,x) l =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   853
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   854
      val (a,b) = revDivide l n
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   855
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   856
      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
   857
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   858
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   859
fun deleteNth n l =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   860
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   861
      val (a,b) = revDivide l n
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   862
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   863
      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
   864
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   865
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   866
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   867
(* Sets implemented with lists.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   868
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   869
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   870
fun mem x = List.exists (equal x);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   871
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   872
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
   873
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   874
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
   875
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   876
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   877
  fun inc (v,x) = if mem v x then x else v :: 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
  fun setify s = List.rev (List.foldl inc [] s);
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   880
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   881
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   882
fun union s t =
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 t (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 intersect s t =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   890
    let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   891
      fun inc (v,x) = if mem v t then v :: x else x
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   892
    in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   893
      List.foldl inc [] (List.rev s)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   894
    end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   895
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   896
fun difference s t =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   897
    let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   898
      fun inc (v,x) = if mem v t then x else v :: x
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   899
    in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   900
      List.foldl inc [] (List.rev s)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
   901
    end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   902
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   903
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
   904
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   905
fun distinct [] = true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   906
  | 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
   907
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   908
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   909
(* Sorting and searching.                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   910
(* ------------------------------------------------------------------------- *)
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
(* 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
   913
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   914
fun minimum 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 min (l,m,r) _ [] = (m, List.revAppend (l,r))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   917
        | min (best as (_,m,_)) l (x :: r) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   918
          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
   919
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   920
      fn [] => raise Empty
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   921
       | h :: t => min ([],h,t) [h] t
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   922
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   923
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   924
fun maximum cmp = minimum (revCompare cmp);
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 (for the following merge-sort, but generally useful too). *)
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 merge cmp =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   929
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   930
      fun mrg acc [] ys = List.revAppend (acc,ys)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   931
        | mrg acc xs [] = List.revAppend (acc,xs)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   932
        | mrg acc (xs as x :: xt) (ys as y :: yt) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   933
          (case cmp (x,y) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   934
             GREATER => mrg (y :: acc) xs yt
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   935
           | _ => mrg (x :: acc) xt ys)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   936
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   937
      mrg []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   938
    end;
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
(* Merge sort (stable). *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   941
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   942
fun sort cmp =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   943
    let
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   944
      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
   945
        | findRuns acc r rs (x :: xs) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   946
          case cmp (r,x) of
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   947
            GREATER => findRuns (List.rev (r :: rs) :: acc) x [] xs
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   948
          | _ => findRuns acc x (r :: rs) xs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   949
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
   950
      fun mergeAdj acc [] = List.rev acc
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   951
        | mergeAdj acc (xs as [_]) = List.revAppend (acc,xs)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   952
        | 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
   953
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   954
      fun mergePairs [xs] = xs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   955
        | mergePairs l = mergePairs (mergeAdj [] l)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   956
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   957
      fn [] => []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   958
       | l as [_] => l
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   959
       | h :: t => mergePairs (findRuns [] h [] t)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   960
    end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
   961
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   962
fun sortMap _ _ [] = []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   963
  | sortMap _ _ (l as [_]) = l
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   964
  | sortMap f cmp xs =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   965
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   966
      fun ncmp ((m,_),(n,_)) = cmp (m,n)
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   967
      val nxs = List.map (fn x => (f x, x)) xs
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   968
      val nys = sort ncmp nxs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   969
    in
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   970
      List.map snd nys
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   971
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   972
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   973
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   974
(* Integers.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   975
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   976
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   977
fun interval m 0 = []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   978
  | interval m len = m :: interval (m + 1) (len - 1);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   979
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   980
fun divides _ 0 = true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   981
  | divides 0 _ = false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   982
  | divides a b = b mod (Int.abs a) = 0;
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   985
  fun hcf 0 n = n
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   986
    | hcf 1 _ = 1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   987
    | hcf m n = hcf (n mod m) m;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   988
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   989
  fun gcd m n =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   990
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   991
        val m = Int.abs m
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   992
        and n = Int.abs n
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   993
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   994
        if m < n then hcf m n else hcf n m
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   995
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   996
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
   997
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
   998
(* Primes *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
   999
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1000
datatype sieve =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1001
    Sieve of
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1002
      {max : int,
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1003
       primes : (int * (int * int)) list};
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1005
val initSieve =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1006
    let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1007
      val n = 1
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1008
      and ps = []
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1009
    in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1010
      Sieve
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1011
        {max = n,
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1012
         primes = ps}
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1013
    end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1014
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1015
fun maxSieve (Sieve {max = n, ...}) = n;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1016
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1017
fun primesSieve (Sieve {primes = ps, ...}) = List.map fst ps;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1018
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1019
fun incSieve sieve =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1020
    let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1021
      val n = maxSieve sieve + 1
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1022
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1023
      fun add i ps =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1024
          case ps of
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1025
            [] => (true,[(n,(0,0))])
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1026
          | (p,(k,j)) :: ps =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1027
              let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1028
                val k = (k + i) mod p
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1029
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1030
                val j = j + i
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1031
              in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1032
                if k = 0 then (false, (p,(k,j)) :: ps)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1033
                else
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1034
                  let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1035
                    val (b,ps) = add j ps
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1036
                  in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1037
                    (b, (p,(k,0)) :: ps)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1038
                  end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1039
              end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1040
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1041
      val Sieve {primes = ps, ...} = sieve
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1042
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1043
      val (b,ps) = add 1 ps
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1044
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1045
      val sieve =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1046
          Sieve
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1047
            {max = n,
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1048
             primes = ps}
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1049
    in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1050
      (b,sieve)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1051
    end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1052
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1053
fun nextSieve sieve =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1054
    let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1055
      val (b,sieve) = incSieve sieve
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1056
    in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1057
      if b then (maxSieve sieve, sieve)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1058
      else nextSieve sieve
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1059
    end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1060
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1061
local
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1062
  fun inc s =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1063
      let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1064
        val (_,s) = incSieve s
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1065
      in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1066
        s
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1067
      end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1068
in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1069
  fun primesUpTo m =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1070
      if m <= 1 then []
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1071
      else primesSieve (funpow (m - 1) inc initSieve);
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1072
end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1073
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1074
val primes =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1075
    let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1076
      fun next s n =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1077
          if n <= 0 then []
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1078
          else
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1079
            let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1080
              val (p,s) = nextSieve s
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1081
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1082
              val n = n - 1
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1083
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1084
              val ps = next s n
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1085
            in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1086
              p :: ps
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1087
            end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1088
    in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1089
      next initSieve
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1090
    end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1091
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1092
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1093
(* Strings.                                                                  *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1094
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1095
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1096
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1097
  fun len l = (length l, l)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1098
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1099
  val upper = len (String.explode "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1100
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1101
  val lower = len (String.explode "abcdefghijklmnopqrstuvwxyz");
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1102
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1103
  fun rotate (n,l) c k =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1104
      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
  1105
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1106
  fun rot k c =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1107
      if Char.isLower c then rotate lower c k
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1108
      else if Char.isUpper c then rotate upper c k
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1109
      else c;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1110
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1111
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1112
fun charToInt #"0" = SOME 0
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1113
  | charToInt #"1" = SOME 1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1114
  | charToInt #"2" = SOME 2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1115
  | charToInt #"3" = SOME 3
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1116
  | charToInt #"4" = SOME 4
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1117
  | charToInt #"5" = SOME 5
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1118
  | charToInt #"6" = SOME 6
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1119
  | charToInt #"7" = SOME 7
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1120
  | charToInt #"8" = SOME 8
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1121
  | charToInt #"9" = SOME 9
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1122
  | charToInt _ = NONE;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1123
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1124
fun charFromInt 0 = SOME #"0"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1125
  | charFromInt 1 = SOME #"1"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1126
  | charFromInt 2 = SOME #"2"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1127
  | charFromInt 3 = SOME #"3"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1128
  | charFromInt 4 = SOME #"4"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1129
  | charFromInt 5 = SOME #"5"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1130
  | charFromInt 6 = SOME #"6"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1131
  | charFromInt 7 = SOME #"7"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1132
  | charFromInt 8 = SOME #"8"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1133
  | charFromInt 9 = SOME #"9"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1134
  | charFromInt _ = NONE;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1135
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1136
fun nChars x =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1137
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1138
      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
  1139
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1140
      fn n => String.implode (dup n [])
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1141
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1142
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1143
fun chomp s =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1144
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1145
      val n = size s
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1146
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1147
      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
  1148
      else String.substring (s, 0, n - 1)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1149
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1150
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1151
local
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1152
  fun chop l =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1153
      case l of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1154
        [] => []
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1155
      | h :: t => if Char.isSpace h then chop t else l;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1156
in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  1157
  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
  1158
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1159
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1160
val join = String.concatWith;
23442
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
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1163
  fun match [] l = SOME l
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1164
    | match _ [] = NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1165
    | 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
  1166
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1167
  fun stringify acc [] = acc
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1168
    | stringify acc (h :: t) = stringify (String.implode h :: acc) t;
23442
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
  fun split sep =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1171
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1172
        val pat = String.explode sep
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1173
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  1174
        fun div1 prev recent [] = stringify [] (List.rev recent :: prev)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1175
          | div1 prev recent (l as h :: t) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1176
            case match pat l of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1177
              NONE => div1 prev (h :: recent) t
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  1178
            | SOME rest => div1 (List.rev recent :: prev) [] rest
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1179
      in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1180
        fn s => div1 [] [] (String.explode s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1181
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1182
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1183
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1184
fun capitalize s =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1185
    if s = "" then s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1186
    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
  1187
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1188
fun mkPrefix p s = p ^ s;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1189
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1190
fun destPrefix p =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1191
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1192
      fun check s =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1193
          if String.isPrefix p s then ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1194
          else raise Error "destPrefix"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1195
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1196
      val sizeP = size p
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1197
    in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1198
      fn s =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1199
         let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1200
           val () = check s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1201
         in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1202
           String.extract (s,sizeP,NONE)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1203
         end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1204
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1205
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1206
fun isPrefix p = can (destPrefix p);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1207
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1208
fun stripPrefix pred s =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1209
    Substring.string (Substring.dropl pred (Substring.full s));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1210
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1211
fun mkSuffix p s = s ^ p;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1212
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1213
fun destSuffix p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1214
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1215
      fun check s =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1216
          if String.isSuffix p s then ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1217
          else raise Error "destSuffix"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1218
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1219
      val sizeP = size p
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1220
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1221
      fn s =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1222
         let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1223
           val () = check s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1224
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1225
           val sizeS = size s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1226
         in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1227
           String.substring (s, 0, sizeS - sizeP)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1228
         end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1229
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1230
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1231
fun isSuffix p = can (destSuffix p);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1232
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1233
fun stripSuffix pred s =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1234
    Substring.string (Substring.dropr pred (Substring.full s));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1235
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1236
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1237
(* Tables.                                                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1238
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1239
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1240
type columnAlignment = {leftAlign : bool, padChar : char}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1241
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1242
fun alignColumn {leftAlign,padChar} column =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1243
    let
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1244
      val (n,_) = maximum Int.compare (List.map size column)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1245
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1246
      fun pad entry row =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1247
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1248
            val padding = nChars padChar (n - size entry)
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
            if leftAlign then entry ^ padding ^ row
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1251
            else padding ^ entry ^ row
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1252
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1253
    in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1254
      zipWith pad column
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1255
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1256
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1257
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1258
  fun alignTab aligns rows =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1259
      case aligns of
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1260
        [] => List.map (K "") rows
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1261
      | [{leftAlign = true, padChar = #" "}] => List.map hd rows
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1262
      | align :: aligns =>
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1263
        let
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1264
          val col = List.map hd rows
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1265
          and cols = alignTab aligns (List.map tl rows)
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1266
        in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1267
          alignColumn align col cols
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1268
        end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1269
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1270
  fun alignTable aligns rows =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  1271
      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
  1272
end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1273
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1274
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1275
(* Reals.                                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1276
(* ------------------------------------------------------------------------- *)
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
val realToString = Real.toString;
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
fun percentToString x = Int.toString (Real.round (100.0 * x)) ^ "%";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1281
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1282
fun pos r = Real.max (r,0.0);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1283
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1284
local
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1285
  val invLn2 = 1.0 / Math.ln 2.0;
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1286
in
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1287
  fun log2 x = invLn2 * Math.ln x;
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1288
end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1289
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1290
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1291
(* Sums.                                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1292
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1293
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1294
datatype ('a,'b) sum = Left of 'a | Right of 'b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1295
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1296
fun destLeft (Left l) = l
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1297
  | destLeft _ = raise Error "destLeft";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1298
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1299
fun isLeft (Left _) = true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1300
  | isLeft (Right _) = false;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1301
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1302
fun destRight (Right r) = r
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1303
  | destRight _ = raise Error "destRight";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1304
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1305
fun isRight (Left _) = false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1306
  | isRight (Right _) = true;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1307
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1308
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1309
(* Metis_Useful impure features.                                                   *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1310
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1311
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1312
local
32740
9dd0a2f83429 explicit indication of Unsynchronized.ref;
wenzelm
parents: 30161
diff changeset
  1313
  val generator = Unsynchronized.ref 0
39503
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1314
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1315
  fun newIntThunk () =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1316
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1317
        val n = !generator
39503
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1318
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1319
        val () = generator := n + 1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1320
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1321
        n
39503
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1322
      end;
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1323
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1324
  fun newIntsThunk k () =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1325
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1326
        val n = !generator
39503
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1327
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1328
        val () = generator := n + k
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
        interval n k
39503
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1331
      end;
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1332
in
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1333
  fun newInt () = Metis_Portable.critical newIntThunk ();
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1334
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1335
  fun newInts k =
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1336
      if k <= 0 then []
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
  1337
      else Metis_Portable.critical (newIntsThunk k) ();
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1338
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1339
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1340
fun withRef (r,new) f x =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1341
  let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1342
    val old = !r
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1343
    val () = r := new
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1344
    val y = f x handle e => (r := old; raise e)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1345
    val () = r := old
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1346
  in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1347
    y
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1348
  end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1349
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1350
fun cloneArray a =
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1351
    let
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1352
      fun index i = Array.sub (a,i)
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1353
    in
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1354
      Array.tabulate (Array.length a, index)
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1355
    end;
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  1356
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1357
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1358
(* Environment.                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1359
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1360
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1361
fun host () = Option.getOpt (OS.Process.getEnv "HOSTNAME", "unknown");
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
fun time () = Date.fmt "%H:%M:%S" (Date.fromTimeLocal (Time.now ()));
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1364
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1365
fun date () = Date.fmt "%d/%m/%Y" (Date.fromTimeLocal (Time.now ()));
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1366
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1367
fun readDirectory {directory = dir} =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1368
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1369
      val dirStrm = OS.FileSys.openDir dir
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1370
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1371
      fun readAll acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1372
          case OS.FileSys.readDir dirStrm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1373
            NONE => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1374
          | SOME file =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1375
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1376
              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
  1377
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1378
              val acc = {filename = filename} :: acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1379
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1380
              readAll acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1381
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1382
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1383
      val filenames = readAll []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1384
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1385
      val () = OS.FileSys.closeDir dirStrm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1386
    in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  1387
      List.rev filenames
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1388
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1389
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1390
fun readTextFile {filename} =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1391
  let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1392
    open TextIO
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1393
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1394
    val h = openIn filename
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1395
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1396
    val contents = inputAll h
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1397
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1398
    val () = closeIn h
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1399
  in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1400
    contents
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1401
  end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1402
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1403
fun writeTextFile {contents,filename} =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1404
  let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1405
    open TextIO
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1406
    val h = openOut filename
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1407
    val () = output (h,contents)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1408
    val () = closeOut h
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1409
  in
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
  end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1412
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1413
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1414
(* Profiling and error reporting.                                            *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1415
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1416
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1417
fun chat s = TextIO.output (TextIO.stdOut, s ^ "\n");
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1418
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1419
fun chide s = TextIO.output (TextIO.stdErr, s ^ "\n");
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1420
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1421
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1422
  fun err x s = chide (x ^ ": " ^ s);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1423
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1424
  fun try f x = f x
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1425
      handle e as Error _ => (err "try" (errorToString e); raise e)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1426
           | e as Bug _ => (err "try" (bugToString e); raise e)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1427
           | e => (err "try" "strange exception raised"; raise e);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1428
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1429
  val warn = err "WARNING";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1430
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1431
  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
  1432
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1433
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1434
fun timed f a =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1435
  let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1436
    val tmr = Timer.startCPUTimer ()
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1437
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1438
    val res = f a
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1439
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1440
    val {usr,sys,...} = Timer.checkCPUTimer tmr
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1441
  in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1442
    (Time.toReal usr + Time.toReal sys, res)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1443
  end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1444
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1445
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1446
  val MIN = 1.0;
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
  fun several n t f a =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1449
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1450
      val (t',res) = timed f a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1451
      val t = t + t'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1452
      val n = n + 1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1453
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1454
      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
  1455
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1456
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1457
  fun timedMany f a = several 0 0.0 f a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1458
end;
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
val executionTime =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1461
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1462
      val startTime = Time.toReal (Time.now ())
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1463
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1464
      fn () => Time.toReal (Time.now ()) - startTime
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1465
    end;
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
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1468
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1469
(**** Original file: src/Lazy.sig ****)
23442
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
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1472
(* SUPPORT FOR LAZY EVALUATION                                               *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1473
(* Copyright (c) 2007 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1476
signature Metis_Lazy =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1477
sig
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
type 'a lazy
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1480
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1481
val quickly : 'a -> 'a lazy
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1482
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1483
val delay : (unit -> 'a) -> 'a lazy
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1484
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1485
val force : 'a lazy -> 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1486
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1487
val memoize : (unit -> 'a) -> unit -> 'a
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
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1490
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1491
(**** Original file: src/Lazy.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1492
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1493
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1494
(* SUPPORT FOR LAZY EVALUATION                                               *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1495
(* Copyright (c) 2007 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1496
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1497
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1498
structure Metis_Lazy :> Metis_Lazy =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1499
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1500
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1501
datatype 'a thunk =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1502
    Value of 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1503
  | Thunk of unit -> 'a;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1504
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1505
datatype 'a lazy = Metis_Lazy of 'a thunk Unsynchronized.ref;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1506
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1507
fun quickly v = Metis_Lazy (Unsynchronized.ref (Value v));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1508
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1509
fun delay f = Metis_Lazy (Unsynchronized.ref (Thunk f));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1510
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1511
fun force (Metis_Lazy s) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1512
    case !s of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1513
      Value v => v
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1514
    | Thunk f =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1515
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1516
        val v = f ()
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
        val () = s := Value v
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1519
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1520
        v
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1521
      end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1522
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1523
fun memoize f =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1524
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1525
      val t = delay f
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1526
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1527
      fn () => force t
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1528
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1529
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1530
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1531
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1532
(**** Original file: src/Ordered.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1533
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1534
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1535
(* ORDERED TYPES                                                             *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1536
(* Copyright (c) 2004 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1537
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1538
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1539
signature Metis_Ordered =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1540
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1541
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1542
type t
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1543
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1544
val compare : t * t -> order
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1545
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1546
(*
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1547
  PROVIDES
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1548
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1549
  !x : t. compare (x,x) = EQUAL
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1550
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1551
  !x y : t. compare (x,y) = LESS <=> compare (y,x) = GREATER
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1552
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1553
  !x y : t. compare (x,y) = EQUAL ==> compare (y,x) = EQUAL
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1554
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1555
  !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
  1556
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1557
  !x y z : t.
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1558
    compare (x,y) = LESS andalso compare (y,z) = LESS ==>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1559
    compare (x,z) = LESS
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1560
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1561
  !x y z : t.
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1562
    compare (x,y) = GREATER andalso compare (y,z) = GREATER ==>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1563
    compare (x,z) = GREATER
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1564
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1565
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1566
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1567
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1568
(**** Original file: src/Ordered.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1569
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1570
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1571
(* ORDERED TYPES                                                             *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1572
(* Copyright (c) 2004 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1573
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1574
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1575
structure Metis_IntOrdered =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1576
struct type t = int val compare = Int.compare end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1577
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1578
structure Metis_IntPairOrdered =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1579
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1580
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1581
type t = int * int;
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
fun compare ((i1,j1),(i2,j2)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1584
    case Int.compare (i1,i2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1585
      LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1586
    | EQUAL => Int.compare (j1,j2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1587
    | GREATER => GREATER;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1588
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1589
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1590
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1591
structure Metis_StringOrdered =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1592
struct type t = string val compare = String.compare end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  1593
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1594
(**** Original file: src/Map.sig ****)
39351
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
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1597
(* FINITE MAPS IMPLEMENTED WITH RANDOMLY BALANCED TREES                      *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1598
(* Copyright (c) 2004 Joe Leslie-Hurd, distributed under the BSD License     *)
39351
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
signature Metis_Map =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1602
sig
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1605
(* A type of finite maps.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1606
(* ------------------------------------------------------------------------- *)
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
type ('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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1611
(* Constructors.                                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1612
(* ------------------------------------------------------------------------- *)
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 new : ('key * 'key -> order) -> ('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 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
  1617
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1618
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1619
(* Metis_Map size.                                                                 *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1620
(* ------------------------------------------------------------------------- *)
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 null : ('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
val size : ('key,'a) map -> int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1625
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
(* Querying.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1628
(* ------------------------------------------------------------------------- *)
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 peekKey : ('key,'a) map -> 'key -> ('key * 'a) option
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 peek : ('key,'a) map -> 'key -> 'a option
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 get : ('key,'a) map -> 'key -> 'a  (* raises Error *)
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 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
  1637
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1638
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
  1639
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1640
val random : ('key,'a) map -> 'key * 'a
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1641
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
(* Adding.                                                                   *)
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
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
  1647
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1648
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
  1649
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
(* Removing.                                                                 *)
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1654
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
  1655
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1656
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
  1657
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1658
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
  1659
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1660
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
  1661
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1662
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
  1663
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1664
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1665
(* 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
  1666
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1667
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1668
val merge :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1669
    {first : 'key * 'a -> 'c option,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1670
     second : 'key * 'b -> 'c option,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1671
     both : ('key * 'a) * ('key * 'b) -> 'c option} ->
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1672
    ('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
  1673
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1674
val union :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1675
    (('key * 'a) * ('key * 'a) -> 'a option) ->
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1676
    ('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
  1677
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1678
val intersect :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1679
    (('key * 'a) * ('key * 'b) -> 'c option) ->
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1680
    ('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
  1681
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1682
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1683
(* Metis_Set operations on the domain.                                             *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1684
(* ------------------------------------------------------------------------- *)
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
val inDomain : 'key -> ('key,'a) map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1687
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1688
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
  1689
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1690
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
  1691
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1692
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
  1693
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1694
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
  1695
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1696
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
  1697
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1698
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
  1699
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1700
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
  1701
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1702
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
  1703
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1704
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
  1705
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
(* Mapping and folding.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1708
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1709
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1710
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
  1711
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1712
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
  1713
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1714
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
  1715
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1716
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
  1717
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1718
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
  1719
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1720
val partition :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1721
    ('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
  1722
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1723
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
  1724
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1725
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
  1726
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1727
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1728
(* Searching.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1729
(* ------------------------------------------------------------------------- *)
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
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
  1732
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1733
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
  1734
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1735
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
  1736
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1737
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
  1738
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1739
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
  1740
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1741
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
  1742
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1743
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
  1744
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1745
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1746
(* Comparing.                                                                *)
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1749
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
  1750
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1751
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
  1752
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1753
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1754
(* Converting to and from lists.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1755
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1756
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1757
val keys : ('key,'a) map -> 'key list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1758
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1759
val values : ('key,'a) map -> 'a list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1760
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1761
val toList : ('key,'a) map -> ('key * 'a) list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1762
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1763
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
  1764
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1765
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1766
(* Pretty-printing.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1767
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1768
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1769
val toString : ('key,'a) map -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1770
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
(* Iterators over maps.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1773
(* ------------------------------------------------------------------------- *)
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
type ('key,'a) iterator
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1776
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1777
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
  1778
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1779
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
  1780
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1781
val readIterator : ('key,'a) iterator -> 'key * 'a
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1782
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1783
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
  1784
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1785
end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1786
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  1787
(**** Original file: src/Map.sml ****)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1788
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1789
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1790
(* FINITE MAPS IMPLEMENTED WITH RANDOMLY BALANCED TREES                      *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  1791
(* Copyright (c) 2004 Joe Leslie-Hurd, distributed under the BSD License     *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1792
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1793
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1794
structure Metis_Map :> Metis_Map =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1795
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1796
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
(* Importing useful functionality.                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1799
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1800
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1801
exception Bug = Metis_Useful.Bug;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1802
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1803
exception Error = Metis_Useful.Error;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1804
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1805
val pointerEqual = Metis_Portable.pointerEqual;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1806
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1807
val K = Metis_Useful.K;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1808
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1809
val randomInt = Metis_Portable.randomInt;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1810
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  1811
val randomWord = Metis_Portable.randomWord;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1812
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1813
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1814
(* Converting a comparison function to an equality function.                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1815
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1816
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1817
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
  1818
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1819
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1820
(* Priorities.                                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1821
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1822
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1823
type priority = Word.word;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1824
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1825
val randomPriority = randomWord;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1826
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1827
val comparePriority = Word.compare;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1828
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1829
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1830
(* Priority search trees.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1831
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1832
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1833
datatype ('key,'value) tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1834
    E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1835
  | T of ('key,'value) node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1836
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1837
and ('key,'value) node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1838
    Node of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1839
      {size : int,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1840
       priority : priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1841
       left : ('key,'value) tree,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1842
       key : 'key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1843
       value : 'value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1844
       right : ('key,'value) tree};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1845
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1846
fun lowerPriorityNode node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1847
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1848
      val Node {priority = p1, ...} = node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1849
      and Node {priority = p2, ...} = node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1850
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1851
      comparePriority (p1,p2) = LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1852
    end;
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1855
(* Tree debugging functions.                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1856
(* ------------------------------------------------------------------------- *)
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
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1859
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1860
  fun checkSizes tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1861
      case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1862
        E => 0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1863
      | T (Node {size,left,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 l = checkSizes left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1866
          and r = checkSizes right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1867
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1868
          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
  1869
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1870
          size
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1871
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1872
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1873
  fun checkSorted compareKey x tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1874
      case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1875
        E => x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1876
      | T (Node {left,key,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 x = checkSorted compareKey x left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1879
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1880
          val () =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1881
              case x of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1882
                NONE => ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1883
              | SOME k =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1884
                case compareKey (k,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1885
                  LESS => ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1886
                | EQUAL => raise Bug "duplicate keys"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1887
                | GREATER => raise Bug "unsorted"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1888
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1889
          val x = SOME key
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1890
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1891
          checkSorted compareKey x right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1892
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1893
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1894
  fun checkPriorities compareKey tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1895
      case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1896
        E => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1897
      | T node =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1898
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1899
          val Node {left,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1900
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1901
          val () =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1902
              case checkPriorities compareKey left of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1903
                NONE => ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1904
              | SOME lnode =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1905
                if not (lowerPriorityNode node lnode) then ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1906
                else raise Bug "left child has greater priority"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1907
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1908
          val () =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1909
              case checkPriorities compareKey right of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1910
                NONE => ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1911
              | SOME rnode =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1912
                if not (lowerPriorityNode node rnode) then ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1913
                else raise Bug "right child has greater priority"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1914
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1915
          SOME node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1916
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1917
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1918
  fun treeCheckInvariants compareKey tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1919
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1920
        val _ = checkSizes tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1921
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1922
        val _ = checkSorted compareKey NONE tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1923
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1924
        val _ = checkPriorities compareKey tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1925
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1926
        tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1927
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1928
      handle Error err => raise Bug err;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1929
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1930
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1931
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1932
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1933
(* Tree operations.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1934
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1935
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1936
fun treeNew () = E;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1937
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1938
fun nodeSize (Node {size = x, ...}) = x;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1939
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1940
fun treeSize tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1941
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1942
      E => 0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1943
    | T x => nodeSize x;
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
fun mkNode priority left key value right =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1946
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1947
      val size = treeSize left + 1 + treeSize right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1948
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1949
      Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1950
        {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1951
         priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1952
         left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1953
         key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1954
         value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1955
         right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1956
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1957
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1958
fun mkTree priority left key value right =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1959
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1960
      val node = mkNode priority left key value right
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
      T node
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1965
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1966
(* 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
  1967
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1968
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1969
fun treeLeftSpine acc tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1970
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1971
      E => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1972
    | T node => nodeLeftSpine acc node
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
and nodeLeftSpine acc node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1975
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1976
      val Node {left,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1977
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1978
      treeLeftSpine (node :: acc) left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1979
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1980
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1981
fun treeRightSpine acc tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1982
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1983
      E => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1984
    | T node => nodeRightSpine acc node
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
and nodeRightSpine acc node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1987
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1988
      val Node {right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1989
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1990
      treeRightSpine (node :: acc) right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1991
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1992
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1993
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1994
(* Singleton trees.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1995
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1996
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1997
fun mkNodeSingleton priority key value =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1998
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  1999
      val size = 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2000
      and left = E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2001
      and right = E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2002
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2003
      Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2004
        {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2005
         priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2006
         left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2007
         key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2008
         value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2009
         right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2010
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2011
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2012
fun nodeSingleton (key,value) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2013
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2014
      val priority = randomPriority ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2015
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2016
      mkNodeSingleton priority key value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2017
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2018
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2019
fun treeSingleton key_value =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2020
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2021
      val node = nodeSingleton key_value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2022
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2023
      T node
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2027
(* 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
  2028
(* every element of the second tree.                                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2029
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2030
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2031
fun treeAppend tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2032
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2033
      E => tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2034
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2035
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2036
        E => tree1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2037
      | T node2 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2038
        if lowerPriorityNode node1 node2 then
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2039
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2040
            val Node {priority,left,key,value,right,...} = node2
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
            val left = treeAppend tree1 left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2043
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2044
            mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2045
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2046
        else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2047
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2048
            val Node {priority,left,key,value,right,...} = node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2049
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2050
            val right = treeAppend right tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2051
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2052
            mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2053
          end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2054
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
(* 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
  2057
(* 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
  2058
(* second tree.                                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2059
(* ------------------------------------------------------------------------- *)
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
fun treeCombine left node right =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2062
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2063
      val left_node = treeAppend left (T node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2064
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2065
      treeAppend left_node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2066
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2067
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2068
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2069
(* Searching a tree for a value.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2070
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2071
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2072
fun treePeek compareKey pkey tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2073
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2074
      E => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2075
    | T node => nodePeek compareKey pkey node
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
and nodePeek compareKey pkey node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2078
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2079
      val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2080
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2081
      case compareKey (pkey,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2082
        LESS => treePeek compareKey pkey left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2083
      | EQUAL => SOME value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2084
      | GREATER => treePeek compareKey pkey right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2085
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2086
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2087
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2088
(* Tree paths.                                                               *)
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
(* 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
  2092
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2093
fun treePeekPath compareKey pkey path tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2094
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2095
      E => (path,NONE)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2096
    | T node => nodePeekPath compareKey pkey path node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2097
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2098
and nodePeekPath compareKey pkey path node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2099
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2100
      val Node {left,key,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2101
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2102
      case compareKey (pkey,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2103
        LESS => treePeekPath compareKey pkey ((true,node) :: path) left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2104
      | EQUAL => (path, SOME node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2105
      | GREATER => treePeekPath compareKey pkey ((false,node) :: path) right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2106
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2107
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2108
(* 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
  2109
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2110
fun addSidePath ((wentLeft,node),(leftTree,rightTree)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2111
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2112
      val Node {priority,left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2113
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2114
      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
  2115
      else (mkTree priority left key value leftTree, rightTree)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2116
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2117
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2118
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
  2119
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2120
fun mkSidesPath path = addSidesPath (E,E) path;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2121
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2122
(* Updating the subtree at a path *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2123
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2124
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2125
  fun updateTree ((wentLeft,node),tree) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2126
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2127
        val Node {priority,left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2128
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2129
        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
  2130
        else mkTree priority left key value tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2131
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2132
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2133
  fun updateTreePath tree = List.foldl updateTree tree;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2134
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2135
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2136
(* Inserting a new node at a path position *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2137
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2138
fun insertNodePath node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2139
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2140
      fun insert left_right path =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2141
          case path of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2142
            [] =>
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 (left,right) = left_right
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
              treeCombine left node right
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
          | (step as (_,snode)) :: rest =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2149
            if lowerPriorityNode snode node then
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2150
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2151
                val left_right = addSidePath (step,left_right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2152
              in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2153
                insert left_right rest
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2154
              end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2155
            else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2156
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2157
                val (left,right) = left_right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2158
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2159
                val tree = treeCombine left node 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 tree 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
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2164
      insert (E,E)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2165
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2166
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2167
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2168
(* 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
  2169
(* 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
  2170
(* greater.                                                                  *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2171
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2172
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2173
fun nodePartition compareKey pkey node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2174
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2175
      val (path,pnode) = nodePeekPath compareKey pkey [] node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2176
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2177
      case pnode of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2178
        NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2179
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2180
          val (left,right) = mkSidesPath path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2181
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2182
          (left,NONE,right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2183
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2184
      | SOME node =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2185
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2186
          val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2187
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2188
          val (left,right) = addSidesPath (left,right) path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2189
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2190
          (left, SOME (key,value), right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2191
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2192
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2193
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2194
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2195
(* Searching a tree for a key/value pair.                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2196
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2197
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2198
fun treePeekKey compareKey pkey tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2199
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2200
      E => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2201
    | T node => nodePeekKey compareKey pkey node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2202
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2203
and nodePeekKey compareKey pkey node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2204
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2205
      val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2206
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2207
      case compareKey (pkey,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2208
        LESS => treePeekKey compareKey pkey left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2209
      | EQUAL => SOME (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2210
      | GREATER => treePeekKey compareKey pkey right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2211
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2212
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2213
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2214
(* Inserting new key/values into the tree.                                   *)
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2217
fun treeInsert compareKey key_value tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2218
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2219
      val (key,value) = key_value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2220
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2221
      val (path,inode) = treePeekPath compareKey key [] tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2222
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2223
      case inode of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2224
        NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2225
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2226
          val node = nodeSingleton (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2227
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2228
          insertNodePath node path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2229
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2230
      | SOME node =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2231
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2232
          val Node {size,priority,left,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2233
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2234
          val node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2235
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2236
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2237
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2238
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2239
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2240
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2241
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2242
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2243
          updateTreePath (T node) path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2244
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2245
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2246
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2247
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2248
(* 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
  2249
(* not present.                                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2250
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2251
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2252
fun treeDelete compareKey dkey tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2253
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2254
      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
  2255
    | T node => nodeDelete compareKey dkey node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2256
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2257
and nodeDelete compareKey dkey node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2258
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2259
      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
  2260
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2261
      case compareKey (dkey,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2262
        LESS =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2263
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2264
          val size = size - 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2265
          and left = treeDelete compareKey dkey left
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
          val node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2268
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2269
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2270
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2271
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2272
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2273
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2274
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2275
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2276
          T node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2277
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2278
      | EQUAL => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2279
      | GREATER =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2280
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2281
          val size = size - 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2282
          and right = treeDelete compareKey dkey 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 node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2285
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2286
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2287
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2288
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2289
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2290
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2291
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2292
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2293
          T node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2294
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2295
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2296
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2297
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2298
(* 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
  2299
(* 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
  2300
(* ------------------------------------------------------------------------- *)
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
fun treeMapPartial f tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2303
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2304
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2305
    | T node => nodeMapPartial f node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2306
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2307
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
  2308
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2309
      val left = treeMapPartial f left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2310
      and vo = f (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2311
      and right = treeMapPartial f right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2312
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2313
      case vo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2314
        NONE => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2315
      | SOME value => mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2316
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2317
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
(* Mapping tree values.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2320
(* ------------------------------------------------------------------------- *)
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
fun treeMap f tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2323
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2324
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2325
    | T node => T (nodeMap f node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2326
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2327
and nodeMap f node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2328
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2329
      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
  2330
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2331
      val left = treeMap f left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2332
      and value = f (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2333
      and right = treeMap f right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2334
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2335
      Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2336
        {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2337
         priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2338
         left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2339
         key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2340
         value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2341
         right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2342
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2343
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2344
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2345
(* 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
  2346
(* 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
  2347
(* ------------------------------------------------------------------------- *)
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
fun treeMerge compareKey f1 f2 fb tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2350
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2351
      E => treeMapPartial f2 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2352
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2353
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2354
        E => treeMapPartial f1 tree1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2355
      | 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
  2356
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2357
and nodeMerge compareKey f1 f2 fb node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2358
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2359
      val Node {priority,left,key,value,right,...} = node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2360
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2361
      val (l,kvo,r) = nodePartition compareKey key node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2362
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2363
      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
  2364
      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
  2365
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2366
      val vo =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2367
          case kvo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2368
            NONE => f2 (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2369
          | SOME kv => fb (kv,(key,value))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2370
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2371
      case vo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2372
        NONE => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2373
      | SOME value =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2374
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2375
          val node = mkNodeSingleton priority key value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2376
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2377
          treeCombine left node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2378
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2379
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2380
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
(* A union operation on trees.                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2383
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2384
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2385
fun treeUnion compareKey f f2 tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2386
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2387
      E => tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2388
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2389
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2390
        E => tree1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2391
      | T node2 => nodeUnion compareKey f f2 node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2392
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2393
and nodeUnion compareKey f f2 node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2394
    if pointerEqual (node1,node2) then nodeMapPartial f2 node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2395
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2396
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2397
        val Node {priority,left,key,value,right,...} = node2
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
        val (l,kvo,r) = nodePartition compareKey key node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2400
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2401
        val left = treeUnion compareKey f f2 l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2402
        and right = treeUnion compareKey f f2 r right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2403
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2404
        val vo =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2405
            case kvo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2406
              NONE => SOME value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2407
            | SOME kv => f (kv,(key,value))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2408
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2409
        case vo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2410
          NONE => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2411
        | SOME value =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2412
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2413
            val node = mkNodeSingleton priority key value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2414
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2415
            treeCombine left node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2416
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2417
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2418
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2419
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2420
(* An intersect operation on trees.                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2421
(* ------------------------------------------------------------------------- *)
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
fun treeIntersect compareKey f t1 t2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2424
    case t1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2425
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2426
    | T n1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2427
      case t2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2428
        E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2429
      | T n2 => nodeIntersect compareKey f n1 n2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2430
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2431
and nodeIntersect compareKey f n1 n2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2432
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2433
      val Node {priority,left,key,value,right,...} = 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
      val (l,kvo,r) = nodePartition compareKey key n1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2436
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2437
      val left = treeIntersect compareKey f l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2438
      and right = treeIntersect compareKey f r right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2439
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2440
      val vo =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2441
          case kvo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2442
            NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2443
          | SOME kv => f (kv,(key,value))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2444
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2445
      case vo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2446
        NONE => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2447
      | SOME value => 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 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
  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 treeUnionDomain 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 => tree2
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 => tree1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2460
      | T node2 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2461
        if pointerEqual (node1,node2) then tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2462
        else nodeUnionDomain compareKey node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2463
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2464
and nodeUnionDomain compareKey node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2465
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2466
      val Node {priority,left,key,value,right,...} = node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2467
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2468
      val (l,_,r) = nodePartition compareKey key node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2469
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2470
      val left = treeUnionDomain compareKey l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2471
      and right = treeUnionDomain compareKey r right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2472
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2473
      val node = mkNodeSingleton priority key value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2474
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2475
      treeCombine left node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2476
    end;
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2479
(* 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
  2480
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2481
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2482
fun treeIntersectDomain compareKey tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2483
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2484
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2485
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2486
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2487
        E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2488
      | T node2 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2489
        if pointerEqual (node1,node2) then tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2490
        else nodeIntersectDomain compareKey node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2491
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2492
and nodeIntersectDomain compareKey node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2493
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2494
      val Node {priority,left,key,value,right,...} = node2
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
      val (l,kvo,r) = nodePartition compareKey key node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2497
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2498
      val left = treeIntersectDomain compareKey l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2499
      and right = treeIntersectDomain compareKey r right
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
      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
  2502
      else treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2503
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2504
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2505
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2506
(* A difference operation on trees.                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2507
(* ------------------------------------------------------------------------- *)
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
fun treeDifferenceDomain compareKey t1 t2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2510
    case t1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2511
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2512
    | T n1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2513
      case t2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2514
        E => t1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2515
      | T n2 => nodeDifferenceDomain compareKey n1 n2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2516
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2517
and nodeDifferenceDomain compareKey n1 n2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2518
    if pointerEqual (n1,n2) then E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2519
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2520
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2521
        val Node {priority,left,key,value,right,...} = n1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2522
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2523
        val (l,kvo,r) = nodePartition compareKey key n2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2524
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2525
        val left = treeDifferenceDomain compareKey left l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2526
        and right = treeDifferenceDomain compareKey right r
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2527
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2528
        if Option.isSome kvo then treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2529
        else mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2530
      end;
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
(* A subset operation on trees.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2534
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2535
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2536
fun treeSubsetDomain compareKey tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2537
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2538
      E => true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2539
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2540
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2541
        E => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2542
      | T node2 => nodeSubsetDomain compareKey node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2543
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2544
and nodeSubsetDomain compareKey node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2545
    pointerEqual (node1,node2) orelse
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 Node {size,left,key,right,...} = node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2548
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2549
      size <= nodeSize node2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2550
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2551
        val (l,kvo,r) = nodePartition compareKey key node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2552
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2553
        Option.isSome kvo andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2554
        treeSubsetDomain compareKey left l andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2555
        treeSubsetDomain compareKey right r
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2556
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2557
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2558
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2559
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2560
(* 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
  2561
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2562
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2563
fun nodePick node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2564
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2565
      val Node {key,value,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2566
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2567
      (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2568
    end;
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
fun treePick tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2571
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2572
      E => raise Bug "Metis_Map.treePick"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2573
    | T node => nodePick node;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2574
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2575
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2576
(* 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
  2577
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2578
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2579
fun nodeDeletePick node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2580
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2581
      val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2582
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2583
      ((key,value), treeAppend left right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2584
    end;
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
fun treeDeletePick tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2587
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2588
      E => raise Bug "Metis_Map.treeDeletePick"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2589
    | T node => nodeDeletePick node;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2590
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2591
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2592
(* 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
  2593
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2594
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2595
fun treeNth n tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2596
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2597
      E => raise Bug "Metis_Map.treeNth"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2598
    | T node => nodeNth n node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2599
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2600
and nodeNth n node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2601
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2602
      val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2603
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2604
      val k = treeSize left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2605
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2606
      if n = k then (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2607
      else if n < k then treeNth n left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2608
      else treeNth (n - (k + 1)) right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2609
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2610
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2611
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2612
(* 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
  2613
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2614
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2615
fun treeDeleteNth n tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2616
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2617
      E => raise Bug "Metis_Map.treeDeleteNth"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2618
    | T node => nodeDeleteNth n node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2619
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2620
and nodeDeleteNth n node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2621
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2622
      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
  2623
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2624
      val k = treeSize left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2625
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2626
      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
  2627
      else if n < k then
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2628
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2629
          val (key_value,left) = treeDeleteNth n left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2630
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2631
          val size = size - 1
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
          val node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2634
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2635
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2636
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2637
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2638
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2639
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2640
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2641
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2642
          (key_value, T node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2643
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2644
      else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2645
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2646
          val n = n - (k + 1)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2647
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2648
          val (key_value,right) = treeDeleteNth n right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2649
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2650
          val size = size - 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2651
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2652
          val node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2653
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2654
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2655
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2656
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2657
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2658
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2659
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2660
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2661
          (key_value, T node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2662
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2663
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2664
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2665
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2666
(* Iterators.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2667
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2668
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2669
datatype ('key,'value) iterator =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2670
    LeftToRightIterator of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2671
      ('key * 'value) * ('key,'value) tree * ('key,'value) node list
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2672
  | RightToLeftIterator of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2673
      ('key * 'value) * ('key,'value) tree * ('key,'value) node list;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2674
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2675
fun fromSpineLeftToRightIterator nodes =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2676
    case nodes of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2677
      [] => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2678
    | Node {key,value,right,...} :: nodes =>
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2679
      SOME (LeftToRightIterator ((key,value),right,nodes));
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2680
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2681
fun fromSpineRightToLeftIterator nodes =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2682
    case nodes of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2683
      [] => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2684
    | Node {key,value,left,...} :: nodes =>
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2685
      SOME (RightToLeftIterator ((key,value),left,nodes));
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2686
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2687
fun addLeftToRightIterator nodes tree = fromSpineLeftToRightIterator (treeLeftSpine nodes tree);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2688
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2689
fun addRightToLeftIterator nodes tree = fromSpineRightToLeftIterator (treeRightSpine nodes tree);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2690
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2691
fun treeMkIterator tree = addLeftToRightIterator [] tree;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2692
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2693
fun treeMkRevIterator tree = addRightToLeftIterator [] tree;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2694
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2695
fun readIterator iter =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2696
    case iter of
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2697
      LeftToRightIterator (key_value,_,_) => key_value
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2698
    | RightToLeftIterator (key_value,_,_) => key_value;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2699
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2700
fun advanceIterator iter =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2701
    case iter of
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2702
      LeftToRightIterator (_,tree,nodes) => addLeftToRightIterator nodes tree
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  2703
    | RightToLeftIterator (_,tree,nodes) => addRightToLeftIterator nodes tree;
39351
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
fun foldIterator f acc io =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2706
    case io of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2707
      NONE => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2708
    | SOME iter =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2709
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2710
        val (key,value) = readIterator iter
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2711
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2712
        foldIterator f (f (key,value,acc)) (advanceIterator iter)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2713
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2714
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2715
fun findIterator pred io =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2716
    case io of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2717
      NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2718
    | SOME iter =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2719
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2720
        val key_value = readIterator iter
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2721
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2722
        if pred key_value then SOME key_value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2723
        else findIterator pred (advanceIterator iter)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2724
      end;
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
fun firstIterator f io =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2727
    case io of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2728
      NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2729
    | SOME iter =>
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 key_value = readIterator iter
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2732
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2733
        case f key_value of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2734
          NONE => firstIterator f (advanceIterator iter)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2735
        | s => s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2736
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2737
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2738
fun compareIterator compareKey compareValue io1 io2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2739
    case (io1,io2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2740
      (NONE,NONE) => EQUAL
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2741
    | (NONE, SOME _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2742
    | (SOME _, NONE) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2743
    | (SOME i1, SOME i2) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2744
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2745
        val (k1,v1) = readIterator i1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2746
        and (k2,v2) = readIterator i2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2747
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2748
        case compareKey (k1,k2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2749
          LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2750
        | EQUAL =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2751
          (case compareValue (v1,v2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2752
             LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2753
           | EQUAL =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2754
             let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2755
               val io1 = advanceIterator i1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2756
               and io2 = advanceIterator i2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2757
             in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2758
               compareIterator compareKey compareValue io1 io2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2759
             end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2760
           | GREATER => GREATER)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2761
        | GREATER => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2762
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2763
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2764
fun equalIterator equalKey equalValue io1 io2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2765
    case (io1,io2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2766
      (NONE,NONE) => true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2767
    | (NONE, SOME _) => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2768
    | (SOME _, NONE) => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2769
    | (SOME i1, SOME i2) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2770
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2771
        val (k1,v1) = readIterator i1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2772
        and (k2,v2) = readIterator i2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2773
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2774
        equalKey k1 k2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2775
        equalValue v1 v2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2776
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2777
          val io1 = advanceIterator i1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2778
          and io2 = advanceIterator i2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2779
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2780
          equalIterator equalKey equalValue io1 io2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2781
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2782
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2783
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2784
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2785
(* A type of finite maps.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2786
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2787
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2788
datatype ('key,'value) map =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2789
    Metis_Map of ('key * 'key -> order) * ('key,'value) tree;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2790
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2791
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2792
(* Metis_Map debugging functions.                                                  *)
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
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2796
fun checkInvariants s m =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2797
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2798
      val Metis_Map (compareKey,tree) = m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2799
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2800
      val _ = treeCheckInvariants compareKey tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2801
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2802
      m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2803
    end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2804
    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
  2805
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2806
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2807
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2808
(* Constructors.                                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2809
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2810
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2811
fun new compareKey =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2812
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2813
      val tree = treeNew ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2814
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2815
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2816
    end;
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
fun singleton compareKey key_value =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2819
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2820
      val tree = treeSingleton key_value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2821
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2822
      Metis_Map (compareKey,tree)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2823
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2824
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2825
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2826
(* Metis_Map size.                                                                 *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2827
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2828
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2829
fun size (Metis_Map (_,tree)) = treeSize tree;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2830
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2831
fun null m = size m = 0;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2832
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2833
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2834
(* Querying.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2835
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2836
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2837
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
  2838
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2839
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
  2840
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2841
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
  2842
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2843
fun get m key =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2844
    case peek m key of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2845
      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
  2846
    | SOME value => value;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2847
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2848
fun pick (Metis_Map (_,tree)) = treePick tree;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2849
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2850
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
  2851
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2852
fun random m =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2853
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2854
      val n = size m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2855
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2856
      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
  2857
      else nth m (randomInt n)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2858
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2859
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
(* Adding.                                                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2862
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2863
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2864
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
  2865
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2866
      val tree = treeInsert compareKey key_value tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2867
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2868
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2869
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2870
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2871
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2872
val insert = fn m => fn kv =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2873
    checkInvariants "Metis_Map.insert: result"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2874
      (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
  2875
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2876
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2877
fun insertList m =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2878
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2879
      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
  2880
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2881
      List.foldl ins m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2882
    end;
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2885
(* Removing.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2886
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2887
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2888
fun delete (Metis_Map (compareKey,tree)) dkey =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2889
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2890
      val tree = treeDelete compareKey dkey tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2891
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2892
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2893
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2894
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2895
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2896
val delete = fn m => fn k =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2897
    checkInvariants "Metis_Map.delete: result"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2898
      (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
  2899
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2900
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2901
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
  2902
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2903
fun deletePick (Metis_Map (compareKey,tree)) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2904
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2905
      val (key_value,tree) = treeDeletePick tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2906
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2907
      (key_value, Metis_Map (compareKey,tree))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2908
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2909
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2910
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2911
val deletePick = fn m =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2912
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2913
      val (kv,m) = deletePick (checkInvariants "Metis_Map.deletePick: input" m)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2914
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2915
      (kv, checkInvariants "Metis_Map.deletePick: result" m)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2916
    end;
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
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2919
fun deleteNth (Metis_Map (compareKey,tree)) n =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2920
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2921
      val (key_value,tree) = treeDeleteNth n tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2922
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2923
      (key_value, Metis_Map (compareKey,tree))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2924
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2925
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2926
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2927
val deleteNth = fn m => fn n =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2928
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2929
      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
  2930
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2931
      (kv, checkInvariants "Metis_Map.deleteNth: result" m)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2932
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2933
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2934
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2935
fun deleteRandom m =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2936
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2937
      val n = size m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2938
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2939
      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
  2940
      else deleteNth m (randomInt n)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2941
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2942
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
(* 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
  2945
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2946
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2947
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
  2948
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2949
      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
  2950
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2951
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2952
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2953
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2954
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2955
val merge = fn f => fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2956
    checkInvariants "Metis_Map.merge: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2957
      (merge f
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2958
         (checkInvariants "Metis_Map.merge: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2959
         (checkInvariants "Metis_Map.merge: input 2" m2));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2960
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2961
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2962
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
  2963
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2964
      fun f2 kv = f (kv,kv)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2965
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2966
      val tree = treeUnion compareKey f f2 tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2967
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2968
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2969
    end;
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
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2972
val union = fn f => fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2973
    checkInvariants "Metis_Map.union: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2974
      (union f
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2975
         (checkInvariants "Metis_Map.union: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2976
         (checkInvariants "Metis_Map.union: input 2" m2));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2977
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2978
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2979
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
  2980
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2981
      val tree = treeIntersect compareKey f tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2982
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2983
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2984
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2985
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2986
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2987
val intersect = fn f => fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2988
    checkInvariants "Metis_Map.intersect: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2989
      (intersect f
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2990
         (checkInvariants "Metis_Map.intersect: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2991
         (checkInvariants "Metis_Map.intersect: input 2" m2));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2992
*)
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2995
(* Iterators over maps.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2996
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  2997
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2998
fun mkIterator (Metis_Map (_,tree)) = treeMkIterator tree;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  2999
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3000
fun mkRevIterator (Metis_Map (_,tree)) = treeMkRevIterator tree;
39351
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3003
(* Mapping and folding.                                                      *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3006
fun mapPartial f (Metis_Map (compareKey,tree)) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3007
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3008
      val tree = treeMapPartial f tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3009
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3010
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3011
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3012
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3013
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3014
val mapPartial = fn f => fn m =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3015
    checkInvariants "Metis_Map.mapPartial: result"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3016
      (mapPartial f (checkInvariants "Metis_Map.mapPartial: input" m));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3017
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3018
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3019
fun map f (Metis_Map (compareKey,tree)) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3020
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3021
      val tree = treeMap f tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3022
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3023
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3024
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3025
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3026
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3027
val map = fn f => fn m =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3028
    checkInvariants "Metis_Map.map: result"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3029
      (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
  3030
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3031
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3032
fun transform f = map (fn (_,value) => f value);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3033
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3034
fun filter pred =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3035
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3036
      fun f (key_value as (_,value)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3037
          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
  3038
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3039
      mapPartial f
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3040
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3041
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3042
fun partition p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3043
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3044
      fun np x = not (p x)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3045
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3046
      fn m => (filter p m, filter np m)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3047
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3048
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3049
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
  3050
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3051
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
  3052
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3053
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
  3054
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3055
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3056
(* Searching.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3057
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3058
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3059
fun findl p m = findIterator p (mkIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3060
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3061
fun findr p m = findIterator p (mkRevIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3062
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3063
fun firstl f m = firstIterator f (mkIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3064
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3065
fun firstr f m = firstIterator f (mkRevIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3066
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3067
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
  3068
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3069
fun all p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3070
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3071
      fun np x = not (p x)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3072
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3073
      fn m => not (exists np m)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3074
    end;
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
fun count pred =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3077
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3078
      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
  3079
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3080
      foldl f 0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3081
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3082
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3083
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3084
(* Comparing.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3085
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3086
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3087
fun compare compareValue (m1,m2) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3088
    if pointerEqual (m1,m2) then EQUAL
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3089
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3090
      case Int.compare (size m1, size m2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3091
        LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3092
      | EQUAL =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3093
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3094
          val Metis_Map (compareKey,_) = m1
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3095
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3096
          val io1 = mkIterator m1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3097
          and io2 = mkIterator m2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3098
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3099
          compareIterator compareKey compareValue io1 io2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3100
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3101
      | GREATER => GREATER;
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 equal equalValue m1 m2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3104
    pointerEqual (m1,m2) orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3105
    (size m1 = size m2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3106
     let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3107
       val Metis_Map (compareKey,_) = m1
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3108
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3109
       val io1 = mkIterator m1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3110
       and io2 = mkIterator m2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3111
     in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3112
       equalIterator (equalKey compareKey) equalValue io1 io2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3113
     end);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3114
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3115
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3116
(* Metis_Set operations on the domain.                                             *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3117
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3118
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3119
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
  3120
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3121
      val tree = treeUnionDomain compareKey tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3122
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3123
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3124
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3125
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3126
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3127
val unionDomain = fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3128
    checkInvariants "Metis_Map.unionDomain: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3129
      (unionDomain
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3130
         (checkInvariants "Metis_Map.unionDomain: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3131
         (checkInvariants "Metis_Map.unionDomain: input 2" m2));
39351
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3134
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3135
  fun uncurriedUnionDomain (m,acc) = unionDomain acc m;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3136
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3137
  fun unionListDomain ms =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3138
      case ms of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3139
        [] => raise Bug "Metis_Map.unionListDomain: no sets"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3140
      | m :: ms => List.foldl uncurriedUnionDomain m ms;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3141
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3142
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3143
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
  3144
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3145
      val tree = treeIntersectDomain compareKey tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3146
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3147
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3148
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3149
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3150
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3151
val intersectDomain = fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3152
    checkInvariants "Metis_Map.intersectDomain: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3153
      (intersectDomain
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3154
         (checkInvariants "Metis_Map.intersectDomain: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3155
         (checkInvariants "Metis_Map.intersectDomain: input 2" m2));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3156
*)
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
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3159
  fun uncurriedIntersectDomain (m,acc) = intersectDomain acc m;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3160
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3161
  fun intersectListDomain ms =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3162
      case ms of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3163
        [] => raise Bug "Metis_Map.intersectListDomain: no sets"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3164
      | m :: ms => List.foldl uncurriedIntersectDomain m ms;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3165
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3166
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3167
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
  3168
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3169
      val tree = treeDifferenceDomain compareKey tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3170
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3171
      Metis_Map (compareKey,tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3172
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3173
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3174
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3175
val differenceDomain = fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3176
    checkInvariants "Metis_Map.differenceDomain: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3177
      (differenceDomain
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3178
         (checkInvariants "Metis_Map.differenceDomain: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3179
         (checkInvariants "Metis_Map.differenceDomain: input 2" m2));
39351
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3182
fun symmetricDifferenceDomain m1 m2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3183
    unionDomain (differenceDomain m1 m2) (differenceDomain m2 m1);
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
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
  3186
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3187
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
  3188
    treeSubsetDomain compareKey tree1 tree2;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3189
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3190
fun disjointDomain m1 m2 = null (intersectDomain m1 m2);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3191
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
(* Converting to and from lists.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3194
(* ------------------------------------------------------------------------- *)
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
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
  3197
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3198
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
  3199
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3200
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
  3201
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3202
fun fromList compareKey l =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3203
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3204
      val m = new compareKey
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3205
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3206
      insertList m l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3207
    end;
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3210
(* Pretty-printing.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3211
(* ------------------------------------------------------------------------- *)
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
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
  3214
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3215
end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3216
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  3217
(**** Original file: src/KeyMap.sig ****)
39351
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
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3220
(* FINITE MAPS WITH A FIXED KEY TYPE                                         *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  3221
(* Copyright (c) 2004 Joe Leslie-Hurd, distributed under the BSD License     *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3222
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3223
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3224
signature Metis_KeyMap =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3225
sig
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3226
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3227
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3228
(* A type of map keys.                                                       *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3229
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3230
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3231
type key
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3232
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  3233
val compareKey : key * key -> order
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  3234
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  3235
val equalKey : key -> key -> bool
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  3236
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3237
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3238
(* A type of finite maps.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3239
(* ------------------------------------------------------------------------- *)
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
type '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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3244
(* Constructors.                                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3245
(* ------------------------------------------------------------------------- *)
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 new : unit -> '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 singleton : key * 'a -> '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
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3252
(* Metis_Map size.                                                                 *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3253
(* ------------------------------------------------------------------------- *)
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 null : '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
val size : 'a map -> int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3258
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
(* Querying.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3261
(* ------------------------------------------------------------------------- *)
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 peekKey : 'a map -> key -> (key * 'a) option
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 peek : 'a map -> key -> 'a option
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 get : 'a map -> key -> 'a  (* raises Error *)
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 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
  3270
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3271
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
  3272
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3273
val random : 'a map -> key * 'a
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3274
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
(* Adding.                                                                   *)
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
val insert : 'a map -> key * 'a -> 'a map
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
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
  3282
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
(* Removing.                                                                 *)
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3287
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
  3288
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3289
val remove : 'a map -> key -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3290
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3291
val deletePick : 'a map -> (key * 'a) * 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3292
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3293
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
  3294
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3295
val deleteRandom : 'a map -> (key * 'a) * 'a map
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3298
(* 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
  3299
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3300
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3301
val merge :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3302
    {first : key * 'a -> 'c option,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3303
     second : key * 'b -> 'c option,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3304
     both : (key * 'a) * (key * 'b) -> 'c option} ->
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3305
    'a map -> 'b map -> 'c map
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
val union :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3308
    ((key * 'a) * (key * 'a) -> 'a option) ->
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3309
    'a map -> 'a map -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3310
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3311
val intersect :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3312
    ((key * 'a) * (key * 'b) -> 'c option) ->
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3313
    'a map -> 'b map -> 'c map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3314
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3315
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3316
(* Metis_Set operations on the domain.                                             *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3317
(* ------------------------------------------------------------------------- *)
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
val inDomain : key -> 'a map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3320
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3321
val unionDomain : 'a map -> 'a map -> 'a map
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
val unionListDomain : 'a map list -> 'a map
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
val intersectDomain : 'a map -> 'a map -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3326
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3327
val intersectListDomain : 'a map list -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3328
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3329
val differenceDomain : 'a map -> 'a map -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3330
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3331
val symmetricDifferenceDomain : 'a map -> 'a map -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3332
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3333
val equalDomain : 'a map -> 'a map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3334
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3335
val subsetDomain : 'a map -> 'a map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3336
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3337
val disjointDomain : 'a map -> 'a map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3338
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
(* Mapping and folding.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3341
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3342
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3343
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
  3344
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3345
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
  3346
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3347
val app : (key * 'a -> unit) -> 'a map -> unit
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
val transform : ('a -> 'b) -> 'a map -> 'b map
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
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
  3352
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3353
val partition :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3354
    (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
  3355
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3356
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
  3357
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3358
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
  3359
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3360
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3361
(* Searching.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3362
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3363
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3364
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
  3365
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3366
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
  3367
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3368
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
  3369
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3370
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
  3371
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3372
val exists : (key * 'a -> bool) -> 'a map -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3373
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3374
val all : (key * 'a -> bool) -> 'a map -> bool
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
val count : (key * 'a -> bool) -> 'a map -> int
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
(* Comparing.                                                                *)
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
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
  3383
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3384
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
  3385
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3386
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3387
(* Converting to and from lists.                                             *)
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3390
val keys : 'a map -> key list
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
val values : 'a map -> 'a list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3393
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3394
val toList : 'a map -> (key * 'a) list
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
val fromList : (key * 'a) list -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3397
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3398
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3399
(* Pretty-printing.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3400
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3401
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3402
val toString : 'a map -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3403
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
(* Iterators over maps.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3406
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3407
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3408
type 'a iterator
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3409
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3410
val mkIterator : 'a map -> 'a iterator option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3411
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3412
val mkRevIterator : 'a map -> 'a iterator option
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
val readIterator : 'a iterator -> key * 'a
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
val advanceIterator : 'a iterator -> 'a iterator option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3417
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3418
end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3419
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  3420
(**** Original file: src/KeyMap.sml ****)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3421
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3422
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3423
(* FINITE MAPS WITH A FIXED KEY TYPE                                         *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  3424
(* Copyright (c) 2004 Joe Leslie-Hurd, distributed under the BSD License     *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3425
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3426
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3427
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
  3428
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3429
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3430
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3431
(* Importing from the input signature.                                       *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3432
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3433
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3434
type key = Key.t;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3435
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3436
val compareKey = Key.compare;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3437
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
(* Importing useful functionality.                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3440
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3441
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3442
exception Bug = Metis_Useful.Bug;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3443
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3444
exception Error = Metis_Useful.Error;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3445
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3446
val pointerEqual = Metis_Portable.pointerEqual;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3447
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3448
val K = Metis_Useful.K;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3449
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3450
val randomInt = Metis_Portable.randomInt;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3451
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3452
val randomWord = Metis_Portable.randomWord;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3453
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3454
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3455
(* Converting a comparison function to an equality function.                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3456
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3457
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3458
fun equalKey key1 key2 = compareKey (key1,key2) = EQUAL;
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3461
(* Priorities.                                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3462
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3463
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3464
type priority = Word.word;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3465
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3466
val randomPriority = randomWord;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3467
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3468
val comparePriority = Word.compare;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3469
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3470
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3471
(* Priority search trees.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3472
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3473
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3474
datatype 'value tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3475
    E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3476
  | T of 'value node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3477
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3478
and 'value node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3479
    Node of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3480
      {size : int,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3481
       priority : priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3482
       left : 'value tree,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3483
       key : key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3484
       value : 'value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3485
       right : 'value tree};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3486
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3487
fun lowerPriorityNode node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3488
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3489
      val Node {priority = p1, ...} = node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3490
      and Node {priority = p2, ...} = node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3491
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3492
      comparePriority (p1,p2) = LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3493
    end;
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3496
(* Tree debugging functions.                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3497
(* ------------------------------------------------------------------------- *)
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
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3500
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3501
  fun checkSizes tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3502
      case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3503
        E => 0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3504
      | T (Node {size,left,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 l = checkSizes left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3507
          and r = checkSizes right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3508
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3509
          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
  3510
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3511
          size
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3512
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3513
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3514
  fun checkSorted x tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3515
      case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3516
        E => x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3517
      | T (Node {left,key,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 x = checkSorted x left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3520
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3521
          val () =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3522
              case x of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3523
                NONE => ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3524
              | SOME k =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3525
                case compareKey (k,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3526
                  LESS => ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3527
                | EQUAL => raise Bug "duplicate keys"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3528
                | GREATER => raise Bug "unsorted"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3529
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3530
          val x = SOME key
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3531
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3532
          checkSorted x right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3533
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3534
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3535
  fun checkPriorities tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3536
      case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3537
        E => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3538
      | T node =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3539
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3540
          val Node {left,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3541
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3542
          val () =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3543
              case checkPriorities left of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3544
                NONE => ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3545
              | SOME lnode =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3546
                if not (lowerPriorityNode node lnode) then ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3547
                else raise Bug "left child has greater priority"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3548
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3549
          val () =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3550
              case checkPriorities right of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3551
                NONE => ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3552
              | SOME rnode =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3553
                if not (lowerPriorityNode node rnode) then ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3554
                else raise Bug "right child has greater priority"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3555
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3556
          SOME node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3557
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3558
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3559
  fun treeCheckInvariants tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3560
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3561
        val _ = checkSizes tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3562
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3563
        val _ = checkSorted NONE tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3564
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3565
        val _ = checkPriorities tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3566
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3567
        tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3568
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3569
      handle Error err => raise Bug err;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3570
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3571
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3572
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3573
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3574
(* Tree operations.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3575
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3576
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3577
fun treeNew () = E;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3578
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3579
fun nodeSize (Node {size = x, ...}) = x;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3580
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3581
fun treeSize tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3582
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3583
      E => 0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3584
    | T x => nodeSize x;
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
fun mkNode priority left key value right =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3587
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3588
      val size = treeSize left + 1 + treeSize right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3589
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3590
      Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3591
        {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3592
         priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3593
         left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3594
         key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3595
         value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3596
         right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3597
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3598
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3599
fun mkTree priority left key value right =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3600
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3601
      val node = mkNode priority left key value right
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
      T node
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3606
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3607
(* 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
  3608
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3609
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3610
fun treeLeftSpine acc tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3611
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3612
      E => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3613
    | T node => nodeLeftSpine acc node
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
and nodeLeftSpine acc node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3616
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3617
      val Node {left,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3618
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3619
      treeLeftSpine (node :: acc) left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3620
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3621
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3622
fun treeRightSpine acc tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3623
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3624
      E => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3625
    | T node => nodeRightSpine acc node
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
and nodeRightSpine acc node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3628
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3629
      val Node {right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3630
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3631
      treeRightSpine (node :: acc) right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3632
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3633
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3634
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3635
(* Singleton trees.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3636
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3637
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3638
fun mkNodeSingleton priority key value =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3639
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3640
      val size = 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3641
      and left = E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3642
      and right = E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3643
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3644
      Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3645
        {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3646
         priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3647
         left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3648
         key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3649
         value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3650
         right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3651
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3652
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3653
fun nodeSingleton (key,value) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3654
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3655
      val priority = randomPriority ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3656
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3657
      mkNodeSingleton priority key value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3658
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3659
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3660
fun treeSingleton key_value =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3661
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3662
      val node = nodeSingleton key_value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3663
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3664
      T node
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3668
(* 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
  3669
(* every element of the second tree.                                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3670
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3671
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3672
fun treeAppend tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3673
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3674
      E => tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3675
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3676
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3677
        E => tree1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3678
      | T node2 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3679
        if lowerPriorityNode node1 node2 then
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3680
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3681
            val Node {priority,left,key,value,right,...} = node2
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
            val left = treeAppend tree1 left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3684
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3685
            mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3686
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3687
        else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3688
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3689
            val Node {priority,left,key,value,right,...} = node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3690
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3691
            val right = treeAppend right tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3692
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3693
            mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3694
          end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3695
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
(* 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
  3698
(* 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
  3699
(* second tree.                                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3700
(* ------------------------------------------------------------------------- *)
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
fun treeCombine left node right =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3703
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3704
      val left_node = treeAppend left (T node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3705
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3706
      treeAppend left_node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3707
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3708
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3709
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3710
(* Searching a tree for a value.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3711
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3712
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3713
fun treePeek pkey tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3714
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3715
      E => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3716
    | T node => nodePeek pkey node
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
and nodePeek pkey node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3719
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3720
      val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3721
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3722
      case compareKey (pkey,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3723
        LESS => treePeek pkey left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3724
      | EQUAL => SOME value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3725
      | GREATER => treePeek pkey right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3726
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3727
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3728
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3729
(* Tree paths.                                                               *)
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
(* 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
  3733
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3734
fun treePeekPath pkey path tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3735
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3736
      E => (path,NONE)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3737
    | T node => nodePeekPath pkey path node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3738
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3739
and nodePeekPath pkey path node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3740
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3741
      val Node {left,key,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3742
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3743
      case compareKey (pkey,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3744
        LESS => treePeekPath pkey ((true,node) :: path) left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3745
      | EQUAL => (path, SOME node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3746
      | GREATER => treePeekPath pkey ((false,node) :: path) right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3747
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3748
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3749
(* 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
  3750
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3751
fun addSidePath ((wentLeft,node),(leftTree,rightTree)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3752
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3753
      val Node {priority,left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3754
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3755
      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
  3756
      else (mkTree priority left key value leftTree, rightTree)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3757
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3758
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3759
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
  3760
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3761
fun mkSidesPath path = addSidesPath (E,E) path;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3762
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3763
(* Updating the subtree at a path *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3764
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3765
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3766
  fun updateTree ((wentLeft,node),tree) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3767
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3768
        val Node {priority,left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3769
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3770
        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
  3771
        else mkTree priority left key value tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3772
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3773
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3774
  fun updateTreePath tree = List.foldl updateTree tree;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3775
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3776
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3777
(* Inserting a new node at a path position *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3778
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3779
fun insertNodePath node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3780
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3781
      fun insert left_right path =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3782
          case path of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3783
            [] =>
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 (left,right) = left_right
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
              treeCombine left node right
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
          | (step as (_,snode)) :: rest =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3790
            if lowerPriorityNode snode node then
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3791
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3792
                val left_right = addSidePath (step,left_right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3793
              in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3794
                insert left_right rest
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3795
              end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3796
            else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3797
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3798
                val (left,right) = left_right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3799
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3800
                val tree = treeCombine left node 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 tree 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
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3805
      insert (E,E)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3806
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3807
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3808
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3809
(* 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
  3810
(* 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
  3811
(* greater.                                                                  *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3812
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3813
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3814
fun nodePartition pkey node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3815
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3816
      val (path,pnode) = nodePeekPath pkey [] node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3817
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3818
      case pnode of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3819
        NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3820
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3821
          val (left,right) = mkSidesPath path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3822
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3823
          (left,NONE,right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3824
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3825
      | SOME node =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3826
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3827
          val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3828
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3829
          val (left,right) = addSidesPath (left,right) path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3830
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3831
          (left, SOME (key,value), right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3832
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3833
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3834
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3835
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3836
(* Searching a tree for a key/value pair.                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3837
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3838
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3839
fun treePeekKey pkey tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3840
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3841
      E => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3842
    | T node => nodePeekKey pkey node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3843
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3844
and nodePeekKey pkey node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3845
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3846
      val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3847
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3848
      case compareKey (pkey,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3849
        LESS => treePeekKey pkey left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3850
      | EQUAL => SOME (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3851
      | GREATER => treePeekKey pkey right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3852
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3853
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3854
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3855
(* Inserting new key/values into the tree.                                   *)
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3858
fun treeInsert key_value tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3859
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3860
      val (key,value) = key_value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3861
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3862
      val (path,inode) = treePeekPath key [] tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3863
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3864
      case inode of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3865
        NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3866
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3867
          val node = nodeSingleton (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3868
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3869
          insertNodePath node path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3870
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3871
      | SOME node =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3872
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3873
          val Node {size,priority,left,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3874
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3875
          val node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3876
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3877
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3878
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3879
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3880
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3881
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3882
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3883
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3884
          updateTreePath (T node) path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3885
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3886
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3887
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3888
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3889
(* 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
  3890
(* not present.                                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3891
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3892
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3893
fun treeDelete dkey tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3894
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  3895
      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
  3896
    | T node => nodeDelete dkey node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3897
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3898
and nodeDelete dkey node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3899
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3900
      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
  3901
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3902
      case compareKey (dkey,key) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3903
        LESS =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3904
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3905
          val size = size - 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3906
          and left = treeDelete dkey left
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
          val node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3909
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3910
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3911
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3912
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3913
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3914
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3915
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3916
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3917
          T node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3918
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3919
      | EQUAL => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3920
      | GREATER =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3921
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3922
          val size = size - 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3923
          and right = treeDelete dkey 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 node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3926
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3927
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3928
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3929
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3930
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3931
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3932
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3933
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3934
          T node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3935
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3936
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3937
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3938
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3939
(* 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
  3940
(* 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
  3941
(* ------------------------------------------------------------------------- *)
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
fun treeMapPartial f tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3944
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3945
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3946
    | T node => nodeMapPartial f node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3947
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3948
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
  3949
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3950
      val left = treeMapPartial f left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3951
      and vo = f (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3952
      and right = treeMapPartial f right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3953
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3954
      case vo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3955
        NONE => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3956
      | SOME value => mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3957
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3958
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
(* Mapping tree values.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3961
(* ------------------------------------------------------------------------- *)
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
fun treeMap f tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3964
    case tree of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3965
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3966
    | T node => T (nodeMap f node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3967
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3968
and nodeMap f node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3969
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3970
      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
  3971
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3972
      val left = treeMap f left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3973
      and value = f (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3974
      and right = treeMap f right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3975
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3976
      Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3977
        {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3978
         priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3979
         left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3980
         key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3981
         value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3982
         right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3983
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3984
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3985
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3986
(* 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
  3987
(* 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
  3988
(* ------------------------------------------------------------------------- *)
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
fun treeMerge f1 f2 fb tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3991
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3992
      E => treeMapPartial f2 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3993
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3994
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3995
        E => treeMapPartial f1 tree1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3996
      | T node2 => nodeMerge f1 f2 fb node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3997
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3998
and nodeMerge f1 f2 fb node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  3999
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4000
      val Node {priority,left,key,value,right,...} = node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4001
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4002
      val (l,kvo,r) = nodePartition key node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4003
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4004
      val left = treeMerge f1 f2 fb l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4005
      and right = treeMerge f1 f2 fb r right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4006
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4007
      val vo =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4008
          case kvo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4009
            NONE => f2 (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4010
          | SOME kv => fb (kv,(key,value))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4011
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4012
      case vo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4013
        NONE => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4014
      | SOME value =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4015
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4016
          val node = mkNodeSingleton priority key value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4017
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4018
          treeCombine left node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4019
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4020
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4021
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4022
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4023
(* A union operation on trees.                                               *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4024
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4025
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4026
fun treeUnion f f2 tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4027
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4028
      E => tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4029
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4030
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4031
        E => tree1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4032
      | T node2 => nodeUnion f f2 node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4033
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4034
and nodeUnion f f2 node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4035
    if pointerEqual (node1,node2) then nodeMapPartial f2 node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4036
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4037
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4038
        val Node {priority,left,key,value,right,...} = node2
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
        val (l,kvo,r) = nodePartition key node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4041
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4042
        val left = treeUnion f f2 l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4043
        and right = treeUnion f f2 r right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4044
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4045
        val vo =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4046
            case kvo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4047
              NONE => SOME value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4048
            | SOME kv => f (kv,(key,value))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4049
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4050
        case vo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4051
          NONE => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4052
        | SOME value =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4053
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4054
            val node = mkNodeSingleton priority key value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4055
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4056
            treeCombine left node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4057
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4058
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4059
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4060
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4061
(* An intersect operation on trees.                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4062
(* ------------------------------------------------------------------------- *)
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
fun treeIntersect f t1 t2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4065
    case t1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4066
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4067
    | T n1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4068
      case t2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4069
        E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4070
      | T n2 => nodeIntersect f n1 n2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4071
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4072
and nodeIntersect f n1 n2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4073
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4074
      val Node {priority,left,key,value,right,...} = 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
      val (l,kvo,r) = nodePartition key n1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4077
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4078
      val left = treeIntersect f l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4079
      and right = treeIntersect f r right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4080
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4081
      val vo =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4082
          case kvo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4083
            NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4084
          | SOME kv => f (kv,(key,value))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4085
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4086
      case vo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4087
        NONE => treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4088
      | SOME value => 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 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
  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 treeUnionDomain 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 => tree2
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 => tree1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4101
      | T node2 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4102
        if pointerEqual (node1,node2) then tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4103
        else nodeUnionDomain node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4104
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4105
and nodeUnionDomain node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4106
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4107
      val Node {priority,left,key,value,right,...} = node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4108
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4109
      val (l,_,r) = nodePartition key node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4110
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4111
      val left = treeUnionDomain l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4112
      and right = treeUnionDomain r right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4113
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4114
      val node = mkNodeSingleton priority key value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4115
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4116
      treeCombine left node right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4117
    end;
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4120
(* 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
  4121
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4122
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4123
fun treeIntersectDomain tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4124
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4125
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4126
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4127
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4128
        E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4129
      | T node2 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4130
        if pointerEqual (node1,node2) then tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4131
        else nodeIntersectDomain node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4132
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4133
and nodeIntersectDomain node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4134
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4135
      val Node {priority,left,key,value,right,...} = node2
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
      val (l,kvo,r) = nodePartition key node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4138
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4139
      val left = treeIntersectDomain l left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4140
      and right = treeIntersectDomain r right
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
      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
  4143
      else treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4144
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4145
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4146
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4147
(* A difference operation on trees.                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4148
(* ------------------------------------------------------------------------- *)
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
fun treeDifferenceDomain t1 t2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4151
    case t1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4152
      E => E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4153
    | T n1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4154
      case t2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4155
        E => t1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4156
      | T n2 => nodeDifferenceDomain n1 n2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4157
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4158
and nodeDifferenceDomain n1 n2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4159
    if pointerEqual (n1,n2) then E
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4160
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4161
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4162
        val Node {priority,left,key,value,right,...} = n1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4163
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4164
        val (l,kvo,r) = nodePartition key n2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4165
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4166
        val left = treeDifferenceDomain left l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4167
        and right = treeDifferenceDomain right r
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4168
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4169
        if Option.isSome kvo then treeAppend left right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4170
        else mkTree priority left key value right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4171
      end;
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
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4174
(* A subset operation on trees.                                              *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4175
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4176
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4177
fun treeSubsetDomain tree1 tree2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4178
    case tree1 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4179
      E => true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4180
    | T node1 =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4181
      case tree2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4182
        E => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4183
      | T node2 => nodeSubsetDomain node1 node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4184
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4185
and nodeSubsetDomain node1 node2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4186
    pointerEqual (node1,node2) orelse
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 Node {size,left,key,right,...} = node1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4189
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4190
      size <= nodeSize node2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4191
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4192
        val (l,kvo,r) = nodePartition key node2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4193
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4194
        Option.isSome kvo andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4195
        treeSubsetDomain left l andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4196
        treeSubsetDomain right r
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4197
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4198
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4199
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4200
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4201
(* 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
  4202
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4203
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4204
fun nodePick node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4205
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4206
      val Node {key,value,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4207
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4208
      (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4209
    end;
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
fun treePick tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4212
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4213
      E => raise Bug "Metis_KeyMap.treePick"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4214
    | T node => nodePick node;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4215
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4216
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4217
(* 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
  4218
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4219
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4220
fun nodeDeletePick node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4221
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4222
      val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4223
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4224
      ((key,value), treeAppend left right)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4225
    end;
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
fun treeDeletePick tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4228
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4229
      E => raise Bug "Metis_KeyMap.treeDeletePick"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4230
    | T node => nodeDeletePick node;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4231
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4232
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4233
(* 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
  4234
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4235
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4236
fun treeNth n tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4237
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4238
      E => raise Bug "Metis_KeyMap.treeNth"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4239
    | T node => nodeNth n node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4240
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4241
and nodeNth n node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4242
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4243
      val Node {left,key,value,right,...} = node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4244
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4245
      val k = treeSize left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4246
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4247
      if n = k then (key,value)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4248
      else if n < k then treeNth n left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4249
      else treeNth (n - (k + 1)) right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4250
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4251
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4252
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4253
(* 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
  4254
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4255
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4256
fun treeDeleteNth n tree =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4257
    case tree of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4258
      E => raise Bug "Metis_KeyMap.treeDeleteNth"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4259
    | T node => nodeDeleteNth n node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4260
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4261
and nodeDeleteNth n node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4262
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4263
      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
  4264
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4265
      val k = treeSize left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4266
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4267
      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
  4268
      else if n < k then
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4269
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4270
          val (key_value,left) = treeDeleteNth n left
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4271
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4272
          val size = size - 1
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
          val node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4275
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4276
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4277
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4278
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4279
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4280
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4281
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4282
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4283
          (key_value, T node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4284
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4285
      else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4286
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4287
          val n = n - (k + 1)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4288
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4289
          val (key_value,right) = treeDeleteNth n right
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4290
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4291
          val size = size - 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4292
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4293
          val node =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4294
              Node
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4295
                {size = size,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4296
                 priority = priority,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4297
                 left = left,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4298
                 key = key,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4299
                 value = value,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4300
                 right = right}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4301
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4302
          (key_value, T node)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4303
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4304
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4305
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4306
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4307
(* Iterators.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4308
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4309
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4310
datatype 'value iterator =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4311
    LeftToRightIterator of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4312
      (key * 'value) * 'value tree * 'value node list
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4313
  | RightToLeftIterator of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4314
      (key * 'value) * 'value tree * 'value node list;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4315
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4316
fun fromSpineLeftToRightIterator nodes =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4317
    case nodes of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4318
      [] => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4319
    | Node {key,value,right,...} :: nodes =>
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4320
      SOME (LeftToRightIterator ((key,value),right,nodes));
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4321
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4322
fun fromSpineRightToLeftIterator nodes =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4323
    case nodes of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4324
      [] => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4325
    | Node {key,value,left,...} :: nodes =>
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4326
      SOME (RightToLeftIterator ((key,value),left,nodes));
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4327
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4328
fun addLeftToRightIterator nodes tree = fromSpineLeftToRightIterator (treeLeftSpine nodes tree);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4329
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4330
fun addRightToLeftIterator nodes tree = fromSpineRightToLeftIterator (treeRightSpine nodes tree);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4331
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4332
fun treeMkIterator tree = addLeftToRightIterator [] tree;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4333
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4334
fun treeMkRevIterator tree = addRightToLeftIterator [] tree;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4335
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4336
fun readIterator iter =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4337
    case iter of
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4338
      LeftToRightIterator (key_value,_,_) => key_value
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4339
    | RightToLeftIterator (key_value,_,_) => key_value;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4340
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4341
fun advanceIterator iter =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4342
    case iter of
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4343
      LeftToRightIterator (_,tree,nodes) => addLeftToRightIterator nodes tree
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4344
    | RightToLeftIterator (_,tree,nodes) => addRightToLeftIterator nodes tree;
39351
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
fun foldIterator f acc io =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4347
    case io of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4348
      NONE => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4349
    | SOME iter =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4350
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4351
        val (key,value) = readIterator iter
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4352
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4353
        foldIterator f (f (key,value,acc)) (advanceIterator iter)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4354
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4355
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4356
fun findIterator pred io =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4357
    case io of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4358
      NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4359
    | SOME iter =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4360
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4361
        val key_value = readIterator iter
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4362
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4363
        if pred key_value then SOME key_value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4364
        else findIterator pred (advanceIterator iter)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4365
      end;
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
fun firstIterator f io =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4368
    case io of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4369
      NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4370
    | SOME iter =>
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 key_value = readIterator iter
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4373
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4374
        case f key_value of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4375
          NONE => firstIterator f (advanceIterator iter)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4376
        | s => s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4377
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4378
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4379
fun compareIterator compareValue io1 io2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4380
    case (io1,io2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4381
      (NONE,NONE) => EQUAL
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4382
    | (NONE, SOME _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4383
    | (SOME _, NONE) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4384
    | (SOME i1, SOME i2) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4385
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4386
        val (k1,v1) = readIterator i1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4387
        and (k2,v2) = readIterator i2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4388
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4389
        case compareKey (k1,k2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4390
          LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4391
        | EQUAL =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4392
          (case compareValue (v1,v2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4393
             LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4394
           | EQUAL =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4395
             let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4396
               val io1 = advanceIterator i1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4397
               and io2 = advanceIterator i2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4398
             in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4399
               compareIterator compareValue io1 io2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4400
             end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4401
           | GREATER => GREATER)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4402
        | GREATER => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4403
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4404
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4405
fun equalIterator equalValue io1 io2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4406
    case (io1,io2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4407
      (NONE,NONE) => true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4408
    | (NONE, SOME _) => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4409
    | (SOME _, NONE) => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4410
    | (SOME i1, SOME i2) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4411
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4412
        val (k1,v1) = readIterator i1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4413
        and (k2,v2) = readIterator i2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4414
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4415
        equalKey k1 k2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4416
        equalValue v1 v2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4417
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4418
          val io1 = advanceIterator i1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4419
          and io2 = advanceIterator i2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4420
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4421
          equalIterator equalValue io1 io2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4422
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4423
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4424
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4425
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4426
(* A type of finite maps.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4427
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4428
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4429
datatype 'value map =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4430
    Metis_Map of 'value tree;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4431
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4432
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4433
(* Metis_Map debugging functions.                                                  *)
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
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4437
fun checkInvariants s m =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4438
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4439
      val Metis_Map tree = m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4440
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4441
      val _ = treeCheckInvariants tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4442
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4443
      m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4444
    end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4445
    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
  4446
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4447
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4448
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4449
(* Constructors.                                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4450
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4451
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4452
fun new () =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4453
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4454
      val tree = treeNew ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4455
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4456
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4457
    end;
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
fun singleton key_value =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4460
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4461
      val tree = treeSingleton key_value
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4462
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4463
      Metis_Map tree
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4464
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4465
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4466
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4467
(* Metis_Map size.                                                                 *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4468
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4469
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4470
fun size (Metis_Map tree) = treeSize tree;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4471
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4472
fun null m = size m = 0;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4473
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4474
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4475
(* Querying.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4476
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4477
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4478
fun peekKey (Metis_Map tree) key = treePeekKey key tree;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4479
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4480
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
  4481
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4482
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
  4483
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4484
fun get m key =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4485
    case peek m key of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4486
      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
  4487
    | SOME value => value;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4488
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4489
fun pick (Metis_Map tree) = treePick tree;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4490
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4491
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
  4492
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4493
fun random m =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4494
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4495
      val n = size m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4496
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4497
      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
  4498
      else nth m (randomInt n)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4499
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4500
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
(* Adding.                                                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4503
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4504
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4505
fun insert (Metis_Map tree) key_value =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4506
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4507
      val tree = treeInsert key_value tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4508
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4509
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4510
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4511
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4512
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4513
val insert = fn m => fn kv =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4514
    checkInvariants "Metis_KeyMap.insert: result"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4515
      (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
  4516
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4517
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4518
fun insertList m =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4519
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4520
      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
  4521
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4522
      List.foldl ins m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4523
    end;
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4526
(* Removing.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4527
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4528
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4529
fun delete (Metis_Map tree) dkey =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4530
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4531
      val tree = treeDelete dkey tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4532
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4533
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4534
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4535
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4536
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4537
val delete = fn m => fn k =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4538
    checkInvariants "Metis_KeyMap.delete: result"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4539
      (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
  4540
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4541
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4542
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
  4543
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4544
fun deletePick (Metis_Map tree) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4545
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4546
      val (key_value,tree) = treeDeletePick tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4547
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4548
      (key_value, Metis_Map tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4549
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4550
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4551
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4552
val deletePick = fn m =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4553
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4554
      val (kv,m) = deletePick (checkInvariants "Metis_KeyMap.deletePick: input" m)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4555
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4556
      (kv, checkInvariants "Metis_KeyMap.deletePick: result" m)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4557
    end;
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
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4560
fun deleteNth (Metis_Map tree) n =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4561
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4562
      val (key_value,tree) = treeDeleteNth n tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4563
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4564
      (key_value, Metis_Map tree)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4565
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4566
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4567
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4568
val deleteNth = fn m => fn n =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4569
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4570
      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
  4571
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4572
      (kv, checkInvariants "Metis_KeyMap.deleteNth: result" m)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4573
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4574
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4575
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4576
fun deleteRandom m =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4577
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4578
      val n = size m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4579
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4580
      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
  4581
      else deleteNth m (randomInt n)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4582
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4583
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
(* 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
  4586
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4587
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4588
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
  4589
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4590
      val tree = treeMerge first second both tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4591
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4592
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4593
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4594
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4595
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4596
val merge = fn f => fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4597
    checkInvariants "Metis_KeyMap.merge: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4598
      (merge f
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4599
         (checkInvariants "Metis_KeyMap.merge: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4600
         (checkInvariants "Metis_KeyMap.merge: input 2" m2));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4601
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4602
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4603
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
  4604
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4605
      fun f2 kv = f (kv,kv)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4606
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4607
      val tree = treeUnion f f2 tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4608
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4609
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4610
    end;
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
(*BasicDebug
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4613
val union = fn f => fn m1 => fn m2 =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4614
    checkInvariants "Metis_KeyMap.union: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4615
      (union f
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4616
         (checkInvariants "Metis_KeyMap.union: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4617
         (checkInvariants "Metis_KeyMap.union: input 2" m2));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4618
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4619
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4620
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
  4621
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4622
      val tree = treeIntersect f tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4623
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4624
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4625
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4626
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4627
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4628
val intersect = fn f => fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4629
    checkInvariants "Metis_KeyMap.intersect: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4630
      (intersect f
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4631
         (checkInvariants "Metis_KeyMap.intersect: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4632
         (checkInvariants "Metis_KeyMap.intersect: input 2" m2));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4633
*)
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4636
(* Iterators over maps.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4637
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4638
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4639
fun mkIterator (Metis_Map tree) = treeMkIterator tree;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4640
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4641
fun mkRevIterator (Metis_Map tree) = treeMkRevIterator tree;
39351
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4644
(* Mapping and folding.                                                      *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4647
fun mapPartial f (Metis_Map tree) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4648
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4649
      val tree = treeMapPartial f tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4650
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4651
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4652
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4653
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4654
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4655
val mapPartial = fn f => fn m =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4656
    checkInvariants "Metis_KeyMap.mapPartial: result"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4657
      (mapPartial f (checkInvariants "Metis_KeyMap.mapPartial: input" m));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4658
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4659
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4660
fun map f (Metis_Map tree) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4661
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4662
      val tree = treeMap f tree
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4663
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4664
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4665
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4666
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4667
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4668
val map = fn f => fn m =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4669
    checkInvariants "Metis_KeyMap.map: result"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4670
      (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
  4671
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4672
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4673
fun transform f = map (fn (_,value) => f value);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4674
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4675
fun filter pred =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4676
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4677
      fun f (key_value as (_,value)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4678
          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
  4679
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4680
      mapPartial f
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4681
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4682
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4683
fun partition p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4684
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4685
      fun np x = not (p x)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4686
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4687
      fn m => (filter p m, filter np m)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4688
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4689
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4690
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
  4691
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4692
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
  4693
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4694
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
  4695
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4696
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4697
(* Searching.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4698
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4699
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4700
fun findl p m = findIterator p (mkIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4701
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4702
fun findr p m = findIterator p (mkRevIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4703
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4704
fun firstl f m = firstIterator f (mkIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4705
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4706
fun firstr f m = firstIterator f (mkRevIterator m);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4707
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4708
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
  4709
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4710
fun all p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4711
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4712
      fun np x = not (p x)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4713
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4714
      fn m => not (exists np m)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4715
    end;
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
fun count pred =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4718
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4719
      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
  4720
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4721
      foldl f 0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4722
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4723
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4724
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4725
(* Comparing.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4726
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4727
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4728
fun compare compareValue (m1,m2) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4729
    if pointerEqual (m1,m2) then EQUAL
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4730
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4731
      case Int.compare (size m1, size m2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4732
        LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4733
      | EQUAL =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4734
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4735
          val Metis_Map _ = m1
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4736
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4737
          val io1 = mkIterator m1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4738
          and io2 = mkIterator m2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4739
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4740
          compareIterator compareValue io1 io2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4741
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4742
      | GREATER => GREATER;
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 equal equalValue m1 m2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4745
    pointerEqual (m1,m2) orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4746
    (size m1 = size m2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4747
     let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4748
       val Metis_Map _ = m1
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4749
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4750
       val io1 = mkIterator m1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4751
       and io2 = mkIterator m2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4752
     in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4753
       equalIterator equalValue io1 io2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4754
     end);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4755
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4756
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4757
(* Metis_Set operations on the domain.                                             *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4758
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4759
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4760
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
  4761
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4762
      val tree = treeUnionDomain tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4763
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4764
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4765
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4766
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4767
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4768
val unionDomain = fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4769
    checkInvariants "Metis_KeyMap.unionDomain: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4770
      (unionDomain
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4771
         (checkInvariants "Metis_KeyMap.unionDomain: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4772
         (checkInvariants "Metis_KeyMap.unionDomain: input 2" m2));
39351
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4775
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4776
  fun uncurriedUnionDomain (m,acc) = unionDomain acc m;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4777
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4778
  fun unionListDomain ms =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4779
      case ms of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4780
        [] => raise Bug "Metis_KeyMap.unionListDomain: no sets"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4781
      | m :: ms => List.foldl uncurriedUnionDomain m ms;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4782
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4783
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4784
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
  4785
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4786
      val tree = treeIntersectDomain tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4787
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4788
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4789
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4790
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4791
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4792
val intersectDomain = fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4793
    checkInvariants "Metis_KeyMap.intersectDomain: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4794
      (intersectDomain
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4795
         (checkInvariants "Metis_KeyMap.intersectDomain: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4796
         (checkInvariants "Metis_KeyMap.intersectDomain: input 2" m2));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4797
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4798
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4799
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4800
  fun uncurriedIntersectDomain (m,acc) = intersectDomain acc m;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4801
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4802
  fun intersectListDomain ms =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4803
      case ms of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4804
        [] => raise Bug "Metis_KeyMap.intersectListDomain: no sets"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4805
      | m :: ms => List.foldl uncurriedIntersectDomain m ms;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4806
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4807
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4808
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
  4809
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4810
      val tree = treeDifferenceDomain tree1 tree2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4811
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4812
      Metis_Map tree
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4813
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4814
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4815
(*BasicDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4816
val differenceDomain = fn m1 => fn m2 =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4817
    checkInvariants "Metis_KeyMap.differenceDomain: result"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4818
      (differenceDomain
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4819
         (checkInvariants "Metis_KeyMap.differenceDomain: input 1" m1)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4820
         (checkInvariants "Metis_KeyMap.differenceDomain: input 2" m2));
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4821
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4822
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4823
fun symmetricDifferenceDomain m1 m2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4824
    unionDomain (differenceDomain m1 m2) (differenceDomain m2 m1);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4825
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4826
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
  4827
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4828
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
  4829
    treeSubsetDomain tree1 tree2;
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
fun disjointDomain m1 m2 = null (intersectDomain m1 m2);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4832
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
(* Converting to and from lists.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4835
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4836
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4837
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
  4838
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4839
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
  4840
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4841
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
  4842
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4843
fun fromList l =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4844
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4845
      val m = new ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4846
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4847
      insertList m l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4848
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4849
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
(* Pretty-printing.                                                          *)
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
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
  4855
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4856
end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4857
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4858
structure Metis_IntMap =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4859
Metis_KeyMap (Metis_IntOrdered);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4860
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4861
structure Metis_IntPairMap =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4862
Metis_KeyMap (Metis_IntPairOrdered);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4863
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4864
structure Metis_StringMap =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4865
Metis_KeyMap (Metis_StringOrdered);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4866
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  4867
(**** Original file: src/Set.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4868
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4869
(* ========================================================================= *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4870
(* FINITE SETS IMPLEMENTED WITH RANDOMLY BALANCED TREES                      *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  4871
(* Copyright (c) 2004 Joe Leslie-Hurd, distributed under the BSD License     *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4874
signature Metis_Set =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4875
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4876
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4877
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4878
(* A type of finite sets.                                                    *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4879
(* ------------------------------------------------------------------------- *)
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
type 'elt set
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
(* Constructors.                                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4885
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4886
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4887
val empty : ('elt * 'elt -> order) -> 'elt set
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 singleton : ('elt * 'elt -> order) -> 'elt -> 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4890
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4891
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  4892
(* Metis_Set size.                                                                 *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4893
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4894
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4895
val null : '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 size : 'elt set -> int
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4900
(* Querying.                                                                 *)
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4903
val peek : 'elt set -> 'elt -> 'elt option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4904
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4905
val member : 'elt -> 'elt set -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4906
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4907
val pick : 'elt set -> 'elt  (* an arbitrary element *)
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 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
  4910
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4911
val random : 'elt set -> 'elt
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
(* Adding.                                                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4915
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4916
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4917
val add : 'elt set -> 'elt -> 'elt set
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 addList : 'elt set -> 'elt list -> 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4920
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4921
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4922
(* Removing.                                                                 *)
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4925
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
  4926
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4927
val remove : 'elt set -> 'elt -> 'elt set
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 deletePick : 'elt set -> 'elt * 'elt set
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 deleteNth : 'elt set -> int -> 'elt * 'elt set
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 deleteRandom : 'elt set -> 'elt * '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
(* Joining.                                                                  *)
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 union : 'elt set -> 'elt set -> 'elt set
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
val unionList : 'elt set list -> 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4942
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4943
val intersect : 'elt set -> 'elt set -> 'elt set
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
val intersectList : 'elt set list -> 'elt set
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 difference : 'elt set -> 'elt set -> 'elt set
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 symmetricDifference : 'elt set -> 'elt set -> 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4950
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4951
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4952
(* Mapping and folding.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4953
(* ------------------------------------------------------------------------- *)
23442
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
val filter : ('elt -> bool) -> 'elt set -> 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4956
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4957
val partition : ('elt -> bool) -> 'elt set -> 'elt set * 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4958
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4959
val app : ('elt -> unit) -> 'elt set -> unit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4960
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4961
val foldl : ('elt * 's -> 's) -> 's -> 'elt set -> 's
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4962
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4963
val foldr : ('elt * 's -> 's) -> 's -> 'elt set -> 's
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4964
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4965
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4966
(* Searching.                                                                *)
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
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4969
val findl : ('elt -> bool) -> 'elt set -> 'elt option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4970
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4971
val findr : ('elt -> bool) -> 'elt set -> 'elt option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4972
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4973
val firstl : ('elt -> 'a option) -> 'elt set -> 'a option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4974
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4975
val firstr : ('elt -> 'a option) -> 'elt set -> 'a option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4976
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4977
val exists : ('elt -> bool) -> 'elt set -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4978
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4979
val all : ('elt -> bool) -> 'elt set -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4980
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4981
val count : ('elt -> bool) -> 'elt set -> int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4982
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4983
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4984
(* Comparing.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4985
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4986
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4987
val compare : 'elt set * 'elt set -> order
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4988
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4989
val equal : 'elt set -> 'elt set -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4990
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4991
val subset : 'elt set -> 'elt set -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4992
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4993
val disjoint : 'elt set -> 'elt set -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4994
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4995
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4996
(* Converting to and from lists.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  4997
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4998
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  4999
val transform : ('elt -> 'a) -> 'elt set -> 'a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5000
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5001
val toList : 'elt set -> 'elt list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5002
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5003
val fromList : ('elt * 'elt -> order) -> 'elt list -> 'elt set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5004
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5005
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5006
(* Converting to and from maps.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5007
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5008
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5009
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
  5010
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5011
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
  5012
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5013
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
  5014
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5015
val domain : ('elt,'a) map -> 'elt set
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5016
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5017
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5018
(* Pretty-printing.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5019
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5020
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5021
val toString : 'elt set -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5022
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5023
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5024
(* Iterators over sets                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5025
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5026
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5027
type 'elt iterator
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5028
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5029
val mkIterator : 'elt set -> 'elt iterator option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5030
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5031
val mkRevIterator : 'elt set -> 'elt iterator option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5032
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5033
val readIterator : 'elt iterator -> 'elt
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5034
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5035
val advanceIterator : 'elt iterator -> 'elt iterator option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5036
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5037
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5038
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  5039
(**** Original file: src/Set.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5040
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5041
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5042
(* FINITE SETS IMPLEMENTED WITH RANDOMLY BALANCED TREES                      *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5043
(* Copyright (c) 2004 Joe Leslie-Hurd, distributed under the BSD License     *)
39351
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5046
structure Metis_Set :> Metis_Set =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5047
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5048
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5049
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5050
(* A type of finite sets.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5051
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5052
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5053
type ('elt,'a) map = ('elt,'a) Metis_Map.map;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5054
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5055
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
  5056
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5057
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5058
(* Converting to and from maps.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5059
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5060
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5061
fun dest (Metis_Set m) = m;
39351
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
fun mapPartial f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5064
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5065
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5066
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5067
      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
  5068
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5069
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5070
fun map f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5071
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5072
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5073
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5074
      fn Metis_Set m => Metis_Map.map mf m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5075
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5076
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5077
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
  5078
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5079
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5080
(* Constructors.                                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5081
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5082
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5083
fun empty cmp = Metis_Set (Metis_Map.new cmp);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5084
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5085
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
  5086
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5087
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5088
(* Metis_Set size.                                                                 *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5089
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5090
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5091
fun null (Metis_Set m) = Metis_Map.null m;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5092
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5093
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
  5094
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5095
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5096
(* Querying.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5097
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5098
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5099
fun peek (Metis_Set m) elt =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5100
    case Metis_Map.peekKey m elt of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5101
      SOME (elt,()) => SOME elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5102
    | NONE => NONE;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5103
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5104
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
  5105
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5106
fun pick (Metis_Set m) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5107
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5108
      val (elt,_) = Metis_Map.pick m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5109
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5110
      elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5111
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5112
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5113
fun nth (Metis_Set m) n =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5114
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5115
      val (elt,_) = Metis_Map.nth m n
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5116
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5117
      elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5118
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5119
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5120
fun random (Metis_Set m) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5121
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5122
      val (elt,_) = Metis_Map.random m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5123
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5124
      elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5125
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5126
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5127
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5128
(* Adding.                                                                   *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5131
fun add (Metis_Set m) elt =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5132
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5133
      val m = Metis_Map.insert m (elt,())
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5134
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5135
      Metis_Set m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5136
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5137
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5138
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5139
  fun uncurriedAdd (elt,set) = add set elt;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5140
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5141
  fun addList set = List.foldl uncurriedAdd set;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5142
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5143
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5144
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5145
(* Removing.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5146
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5147
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5148
fun delete (Metis_Set m) elt =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5149
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5150
      val m = Metis_Map.delete m elt
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5151
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5152
      Metis_Set m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5153
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5154
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5155
fun remove (Metis_Set m) elt =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5156
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5157
      val m = Metis_Map.remove m elt
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5158
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5159
      Metis_Set m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5160
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5161
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5162
fun deletePick (Metis_Set m) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5163
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5164
      val ((elt,()),m) = Metis_Map.deletePick m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5165
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5166
      (elt, Metis_Set m)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5167
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5168
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5169
fun deleteNth (Metis_Set m) n =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5170
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5171
      val ((elt,()),m) = Metis_Map.deleteNth m n
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5172
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5173
      (elt, Metis_Set m)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5174
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5175
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5176
fun deleteRandom (Metis_Set m) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5177
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5178
      val ((elt,()),m) = Metis_Map.deleteRandom m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5179
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5180
      (elt, Metis_Set m)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5181
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5182
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5183
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5184
(* Joining.                                                                  *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5185
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5186
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5187
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
  5188
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5189
fun unionList sets =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5190
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5191
      val ms = List.map dest sets
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5192
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5193
      Metis_Set (Metis_Map.unionListDomain ms)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5194
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5195
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5196
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
  5197
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5198
fun intersectList sets =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5199
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5200
      val ms = List.map dest sets
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5201
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5202
      Metis_Set (Metis_Map.intersectListDomain ms)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5203
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5204
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5205
fun difference (Metis_Set m1) (Metis_Set m2) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5206
    Metis_Set (Metis_Map.differenceDomain m1 m2);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5207
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5208
fun symmetricDifference (Metis_Set m1) (Metis_Set m2) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5209
    Metis_Set (Metis_Map.symmetricDifferenceDomain m1 m2);
39351
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5212
(* Mapping and folding.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5213
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5214
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5215
fun filter pred =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5216
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5217
      fun mpred (elt,()) = pred elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5218
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5219
      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
  5220
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5221
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5222
fun partition pred =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5223
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5224
      fun mpred (elt,()) = pred elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5225
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5226
      fn Metis_Set m =>
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5227
         let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5228
           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
  5229
         in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5230
           (Metis_Set m1, Metis_Set m2)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5231
         end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5232
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5233
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5234
fun app f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5235
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5236
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5237
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5238
      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
  5239
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5240
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5241
fun foldl f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5242
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5243
      fun mf (elt,(),acc) = f (elt,acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5244
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5245
      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
  5246
    end;
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
fun foldr f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5249
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5250
      fun mf (elt,(),acc) = f (elt,acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5251
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5252
      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
  5253
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5254
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5255
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5256
(* Searching.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5257
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5258
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5259
fun findl p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5260
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5261
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5262
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5263
      fn Metis_Set m =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5264
         case Metis_Map.findl mp m of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5265
           SOME (elt,()) => SOME elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5266
         | NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5267
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5268
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5269
fun findr p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5270
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5271
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5272
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5273
      fn Metis_Set m =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5274
         case Metis_Map.findr mp m of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5275
           SOME (elt,()) => SOME elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5276
         | NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5277
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5278
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5279
fun firstl f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5280
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5281
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5282
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5283
      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
  5284
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5285
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5286
fun firstr f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5287
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5288
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5289
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5290
      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
  5291
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5292
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5293
fun exists p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5294
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5295
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5296
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5297
      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
  5298
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5299
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5300
fun all p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5301
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5302
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5303
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5304
      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
  5305
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5306
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5307
fun count p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5308
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5309
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5310
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5311
      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
  5312
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5313
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5314
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5315
(* Comparing.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5316
(* ------------------------------------------------------------------------- *)
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
fun compareValue ((),()) = EQUAL;
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
fun equalValue () () = true;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5321
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5322
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
  5323
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5324
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
  5325
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5326
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
  5327
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5328
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
  5329
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5330
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5331
(* Converting to and from lists.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5332
(* ------------------------------------------------------------------------- *)
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
fun transform f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5335
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5336
      fun inc (x,l) = f x :: l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5337
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5338
      foldr inc []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5339
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5340
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5341
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
  5342
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5343
fun fromList cmp elts = addList (empty cmp) elts;
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5346
(* Pretty-printing.                                                          *)
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5349
fun toString set =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5350
    "{" ^ (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
  5351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5352
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5353
(* Iterators over sets                                                       *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5354
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5355
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5356
type 'elt iterator = ('elt,unit) Metis_Map.iterator;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5357
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5358
fun mkIterator (Metis_Set m) = Metis_Map.mkIterator m;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5359
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5360
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
  5361
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5362
fun readIterator iter =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5363
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5364
      val (elt,()) = Metis_Map.readIterator iter
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5365
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5366
      elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5367
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5368
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5369
fun advanceIterator iter = Metis_Map.advanceIterator iter;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5370
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5371
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5372
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  5373
(**** Original file: src/ElementSet.sig ****)
23442
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
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5376
(* FINITE SETS WITH A FIXED ELEMENT TYPE                                     *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5377
(* Copyright (c) 2004 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5380
signature Metis_ElementSet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5381
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5382
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5383
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5384
(* A type of set elements.                                                   *)
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
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5387
type element
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5388
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  5389
val compareElement : element * element -> order
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  5390
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  5391
val equalElement : element -> element -> bool
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  5392
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5393
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5394
(* A type of finite sets.                                                    *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5395
(* ------------------------------------------------------------------------- *)
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
type set
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
(* Constructors.                                                             *)
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 empty : set
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 singleton : element -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5406
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5407
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5408
(* Metis_Set size.                                                                 *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5409
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5410
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5411
val null : 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 size : set -> int
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5416
(* Querying.                                                                 *)
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5419
val peek : set -> element -> element option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5420
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5421
val member : element -> set -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5422
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5423
val pick : set -> element  (* an arbitrary element *)
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 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
  5426
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5427
val random : set -> element
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5430
(* Adding.                                                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5431
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5432
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5433
val add : set -> element -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5434
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5435
val addList : set -> element list -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5436
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5437
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5438
(* Removing.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5439
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5440
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5441
val delete : set -> element -> set  (* must be present *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5442
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5443
val remove : set -> element -> set
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5444
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5445
val deletePick : set -> element * set
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5446
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5447
val deleteNth : set -> int -> element * set
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5448
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5449
val deleteRandom : set -> element * set
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5452
(* Joining.                                                                  *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5453
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5454
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5455
val union : set -> set -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5456
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5457
val unionList : set list -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5458
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5459
val intersect : set -> set -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5460
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5461
val intersectList : set list -> set
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 difference : set -> set -> set
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
val symmetricDifference : set -> set -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5466
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5467
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5468
(* Mapping and folding.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5469
(* ------------------------------------------------------------------------- *)
23442
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 filter : (element -> bool) -> set -> set
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 partition : (element -> bool) -> set -> set * set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5474
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5475
val app : (element -> unit) -> set -> unit
23442
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 foldl : (element * 's -> 's) -> 's -> set -> 's
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
val foldr : (element * 's -> 's) -> 's -> set -> 's
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5480
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5481
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5482
(* Searching.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5483
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5484
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5485
val findl : (element -> bool) -> set -> element option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5486
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5487
val findr : (element -> bool) -> set -> element option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5488
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5489
val firstl : (element -> 'a option) -> set -> 'a option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5490
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5491
val firstr : (element -> 'a option) -> set -> 'a option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5492
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5493
val exists : (element -> bool) -> set -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5494
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5495
val all : (element -> bool) -> set -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5496
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5497
val count : (element -> bool) -> set -> int
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5500
(* Comparing.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5501
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5502
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5503
val compare : set * set -> order
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5504
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5505
val equal : set -> set -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5506
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5507
val subset : set -> set -> bool
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
val disjoint : set -> set -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5510
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5511
(* ------------------------------------------------------------------------- *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5512
(* Pointwise operations.                                                     *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5513
(* ------------------------------------------------------------------------- *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5514
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5515
val lift : (element -> set) -> set -> set
43269
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5516
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5517
val closedAdd : (element -> set) -> set -> set -> set
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5518
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5519
val close : (element -> set) -> set -> set
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5520
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5521
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5522
(* Converting to and from lists.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5523
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5524
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5525
val transform : (element -> 'a) -> set -> 'a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5526
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5527
val toList : set -> element list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5528
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5529
val fromList : element list -> set
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5530
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5531
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5532
(* Converting to and from maps.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5533
(* ------------------------------------------------------------------------- *)
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
type 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5536
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5537
val mapPartial : (element -> 'a option) -> set -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5538
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5539
val map : (element -> 'a) -> set -> 'a map
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5540
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5541
val domain : 'a map -> set
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5542
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5543
(* ------------------------------------------------------------------------- *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5544
(* Depth-first search.                                                       *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5545
(* ------------------------------------------------------------------------- *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5546
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5547
datatype ordering =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5548
    Linear of element list
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5549
  | Cycle of element list
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5550
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5551
val preOrder : (element -> set) -> set -> ordering
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5552
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5553
val postOrder : (element -> set) -> set -> ordering
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5554
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5555
val preOrdered : (element -> set) -> element list -> bool
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5556
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5557
val postOrdered : (element -> set) -> element list -> bool
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5558
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5559
(* ------------------------------------------------------------------------- *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5560
(* Strongly connected components.                                            *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5561
(* ------------------------------------------------------------------------- *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5562
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5563
val preOrderSCC : (element -> set) -> set -> set list
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5564
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5565
val postOrderSCC : (element -> set) -> set -> set list
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5566
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5567
val preOrderedSCC : (element -> set) -> set list -> bool
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5568
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5569
val postOrderedSCC : (element -> set) -> set list -> bool
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5570
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5571
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5572
(* Pretty-printing.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5573
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5574
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5575
val toString : set -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5576
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5577
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5578
(* Iterators over sets                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5579
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5580
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5581
type iterator
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5582
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5583
val mkIterator : set -> iterator option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5584
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5585
val mkRevIterator : set -> iterator option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5586
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5587
val readIterator : iterator -> element
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5588
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5589
val advanceIterator : iterator -> iterator option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5590
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5591
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5592
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  5593
(**** Original file: src/ElementSet.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5594
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5595
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  5596
(* FINITE SETS WITH A FIXED ELEMENT TYPE                                     *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5597
(* Copyright (c) 2004 Joe Leslie-Hurd, distributed under the BSD License     *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5598
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5599
43269
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5600
functor Metis_ElementSet (
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5601
  KM : Metis_KeyMap
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5602
) :> Metis_ElementSet
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5603
where type element = KM.key
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5604
and type 'a map = 'a KM.map =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5605
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5606
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5607
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5608
(* A type of set elements.                                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5609
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5610
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5611
type element = KM.key;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5612
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  5613
val compareElement = KM.compareKey;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  5614
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  5615
val equalElement = KM.equalKey;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  5616
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5617
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5618
(* A type of finite sets.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5619
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5620
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5621
type 'a map = 'a KM.map;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5622
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5623
datatype set = Metis_Set of unit map;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5624
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5625
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5626
(* Converting to and from maps.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5627
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5628
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5629
fun dest (Metis_Set m) = m;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5630
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5631
fun mapPartial f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5632
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5633
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5634
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5635
      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
  5636
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5637
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5638
fun map f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5639
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5640
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5641
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5642
      fn Metis_Set m => KM.map mf m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5643
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5644
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5645
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
  5646
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5647
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5648
(* Constructors.                                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5649
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5650
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5651
val empty = Metis_Set (KM.new ());
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5652
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5653
fun singleton elt = Metis_Set (KM.singleton (elt,()));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5654
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5655
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5656
(* Metis_Set size.                                                                 *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5657
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5658
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5659
fun null (Metis_Set m) = KM.null m;
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 size (Metis_Set m) = KM.size m;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5662
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5663
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5664
(* Querying.                                                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5665
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5666
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5667
fun peek (Metis_Set m) elt =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5668
    case KM.peekKey m elt of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5669
      SOME (elt,()) => SOME elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5670
    | NONE => NONE;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5671
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5672
fun member elt (Metis_Set m) = KM.inDomain elt m;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5673
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5674
fun pick (Metis_Set m) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5675
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5676
      val (elt,_) = KM.pick m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5677
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5678
      elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5679
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5680
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5681
fun nth (Metis_Set m) n =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5682
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5683
      val (elt,_) = KM.nth m n
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5684
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5685
      elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5686
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5687
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5688
fun random (Metis_Set m) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5689
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5690
      val (elt,_) = KM.random m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5691
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5692
      elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5693
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5694
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5695
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5696
(* Adding.                                                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5697
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5698
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5699
fun add (Metis_Set m) elt =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5700
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5701
      val m = KM.insert m (elt,())
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5702
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5703
      Metis_Set m
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5704
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5705
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5706
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5707
  fun uncurriedAdd (elt,set) = add set elt;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5708
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5709
  fun addList set = List.foldl uncurriedAdd set;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5710
end;
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5713
(* Removing.                                                                 *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5716
fun delete (Metis_Set m) elt =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5717
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5718
      val m = KM.delete m elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5719
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5720
      Metis_Set m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5721
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5722
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5723
fun remove (Metis_Set m) elt =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5724
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5725
      val m = KM.remove m elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5726
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5727
      Metis_Set m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5728
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5729
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5730
fun deletePick (Metis_Set m) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5731
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5732
      val ((elt,()),m) = KM.deletePick m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5733
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5734
      (elt, Metis_Set m)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5735
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5736
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5737
fun deleteNth (Metis_Set m) n =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5738
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5739
      val ((elt,()),m) = KM.deleteNth m n
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5740
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5741
      (elt, Metis_Set m)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5742
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5743
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5744
fun deleteRandom (Metis_Set m) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5745
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5746
      val ((elt,()),m) = KM.deleteRandom m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5747
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5748
      (elt, Metis_Set m)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5749
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5750
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5751
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5752
(* Joining.                                                                  *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5753
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5754
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5755
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
  5756
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5757
fun unionList sets =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5758
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5759
      val ms = List.map dest sets
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5760
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5761
      Metis_Set (KM.unionListDomain ms)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5762
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5763
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5764
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
  5765
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5766
fun intersectList sets =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5767
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5768
      val ms = List.map dest sets
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5769
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5770
      Metis_Set (KM.intersectListDomain ms)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5771
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5772
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5773
fun difference (Metis_Set m1) (Metis_Set m2) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5774
    Metis_Set (KM.differenceDomain m1 m2);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5775
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5776
fun symmetricDifference (Metis_Set m1) (Metis_Set m2) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5777
    Metis_Set (KM.symmetricDifferenceDomain m1 m2);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5778
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5779
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5780
(* Mapping and folding.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5781
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5782
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5783
fun filter pred =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5784
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5785
      fun mpred (elt,()) = pred elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5786
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5787
      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
  5788
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5789
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5790
fun partition pred =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5791
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5792
      fun mpred (elt,()) = pred elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5793
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5794
      fn Metis_Set m =>
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5795
         let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5796
           val (m1,m2) = KM.partition mpred m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5797
         in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5798
           (Metis_Set m1, Metis_Set m2)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5799
         end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5800
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5801
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5802
fun app f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5803
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5804
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5805
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5806
      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
  5807
    end;
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 foldl 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 mf (elt,(),acc) = f (elt,acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5812
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5813
      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
  5814
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5815
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5816
fun foldr f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5817
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5818
      fun mf (elt,(),acc) = f (elt,acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5819
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5820
      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
  5821
    end;
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
(* Searching.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5825
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5826
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5827
fun findl p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5828
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5829
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5830
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5831
      fn Metis_Set m =>
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5832
         case KM.findl mp m of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5833
           SOME (elt,()) => SOME elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5834
         | NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5835
    end;
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 findr p =
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
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5840
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5841
      fn Metis_Set m =>
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5842
         case KM.findr mp m of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5843
           SOME (elt,()) => SOME elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5844
         | NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5845
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5846
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5847
fun firstl f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5848
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5849
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5850
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5851
      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
  5852
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5853
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5854
fun firstr f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5855
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5856
      fun mf (elt,()) = f elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5857
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5858
      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
  5859
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5860
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5861
fun exists p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5862
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5863
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5864
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5865
      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
  5866
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5867
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5868
fun all p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5869
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5870
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5871
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5872
      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
  5873
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5874
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5875
fun count p =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5876
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5877
      fun mp (elt,()) = p elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5878
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5879
      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
  5880
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5881
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
(* Comparing.                                                                *)
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5886
fun compareValue ((),()) = EQUAL;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5887
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5888
fun equalValue () () = true;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5889
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5890
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
  5891
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5892
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
  5893
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5894
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
  5895
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5896
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
  5897
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5898
(* ------------------------------------------------------------------------- *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5899
(* Pointwise operations.                                                     *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5900
(* ------------------------------------------------------------------------- *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5901
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5902
fun lift f =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5903
    let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5904
      fun inc (elt,set) = union set (f elt)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5905
    in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5906
      foldl inc empty
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5907
    end;
43269
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5908
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5909
fun closedAdd f =
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5910
    let
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5911
      fun adds acc set = foldl check acc set
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5912
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5913
      and check (elt,acc) =
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5914
          if member elt acc then acc
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5915
          else expand (add acc elt) elt
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5916
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5917
      and expand acc elt = adds acc (f elt)
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5918
    in
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5919
      adds
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5920
    end;
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5921
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5922
fun close f = closedAdd f empty;
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5923
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  5924
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5925
(* Converting to and from lists.                                             *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5926
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5927
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5928
fun transform f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5929
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5930
      fun inc (x,l) = f x :: l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5931
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5932
      foldr inc []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5933
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5934
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  5935
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
  5936
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5937
fun fromList elts = addList empty elts;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5938
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  5939
(* ------------------------------------------------------------------------- *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5940
(* Depth-first search.                                                       *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5941
(* ------------------------------------------------------------------------- *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5942
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5943
datatype ordering =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5944
    Linear of element list
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5945
  | Cycle of element list;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5946
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5947
fun postOrdered children =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5948
    let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5949
      fun check acc elts =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5950
          case elts of
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5951
            [] => true
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5952
          | elt :: elts =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5953
            not (member elt acc) andalso
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5954
            let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5955
              val acc = closedAdd children acc (singleton elt)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5956
            in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5957
              check acc elts
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5958
            end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5959
    in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5960
      check empty
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5961
    end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5962
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5963
fun preOrdered children elts = postOrdered children (List.rev elts);
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5964
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5965
local
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5966
  fun takeStackset elt =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5967
      let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5968
        fun notElement (e,_,_) = not (equalElement e elt)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5969
      in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5970
        Metis_Useful.takeWhile notElement
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5971
      end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5972
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5973
  fun consElement ((e,_,_),el) = e :: el;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5974
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5975
  fun depthFirstSearch children =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5976
      let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5977
        fun traverse (dealt,dealtset) (stack,stackset) work =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5978
            case work of
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5979
              [] =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5980
              (case stack of
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5981
                 [] => Linear dealt
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5982
               | (elt,work,stackset) :: stack =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5983
                 let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5984
                   val dealt = elt :: dealt
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5985
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5986
                   val dealtset = add dealtset elt
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5987
                 in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5988
                   traverse (dealt,dealtset) (stack,stackset) work
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5989
                 end)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5990
            | elt :: work =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5991
              if member elt dealtset then
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5992
                traverse (dealt,dealtset) (stack,stackset) work
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5993
              else if member elt stackset then
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5994
                let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5995
                  val cycle = takeStackset elt stack
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5996
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5997
                  val cycle = elt :: List.foldl consElement [elt] cycle
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5998
                in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  5999
                  Cycle cycle
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6000
                end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6001
              else
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6002
                let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6003
                  val stack = (elt,work,stackset) :: stack
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6005
                  val stackset = add stackset elt
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6006
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6007
                  val work = toList (children elt)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6008
                in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6009
                  traverse (dealt,dealtset) (stack,stackset) work
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6010
                end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6011
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6012
        val dealt = []
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6013
        and dealtset = empty
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6014
        and stack = []
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6015
        and stackset = empty
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6016
      in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6017
        traverse (dealt,dealtset) (stack,stackset)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6018
      end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6019
in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6020
  fun preOrder children roots =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6021
      let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6022
        val result = depthFirstSearch children (toList roots)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6023
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6024
(*BasicDebug
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6025
        val () =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6026
            case result of
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6027
              Cycle _ => ()
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6028
            | Linear l =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6029
              let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6030
                val () =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6031
                    if subset roots (fromList l) then ()
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6032
                    else raise Metis_Useful.Bug "Metis_ElementSet.preOrder: missing roots"
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6033
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6034
                val () =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6035
                    if preOrdered children l then ()
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6036
                    else raise Metis_Useful.Bug "Metis_ElementSet.preOrder: bad ordering"
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6037
              in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6038
                ()
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6039
              end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6040
*)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6041
      in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6042
        result
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6043
      end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6044
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6045
  fun postOrder children roots =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6046
      case depthFirstSearch children (toList roots) of
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6047
        Linear l =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6048
        let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6049
          val l = List.rev l
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6050
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6051
(*BasicDebug
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6052
          val () =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6053
              if subset roots (fromList l) then ()
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6054
              else raise Metis_Useful.Bug "Metis_ElementSet.postOrder: missing roots"
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6055
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6056
          val () =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6057
              if postOrdered children l then ()
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6058
              else raise Metis_Useful.Bug "Metis_ElementSet.postOrder: bad ordering"
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6059
*)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6060
        in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6061
          Linear l
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6062
        end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6063
      | cycle => cycle;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6064
end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6065
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6066
(* ------------------------------------------------------------------------- *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6067
(* Strongly connected components.                                            *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6068
(* ------------------------------------------------------------------------- *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6069
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6070
fun postOrderedSCC children =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6071
    let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6072
      fun check acc eltsl =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6073
          case eltsl of
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6074
            [] => true
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6075
          | elts :: eltsl =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6076
            not (null elts) andalso
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6077
            disjoint elts acc andalso
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6078
            let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6079
              fun addElt elt = closedAdd children acc (singleton elt)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6080
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6081
              val (root,elts) = deletePick elts
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6082
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6083
              fun checkElt elt = member root (addElt elt)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6084
            in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6085
              all checkElt elts andalso
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6086
              let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6087
                val acc = addElt root
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6088
              in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6089
                subset elts acc andalso
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6090
                check acc eltsl
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6091
              end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6092
            end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6093
    in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6094
      check empty
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6095
    end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6096
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6097
fun preOrderedSCC children eltsl = postOrderedSCC children (List.rev eltsl);
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6098
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6099
(* An implementation of Tarjan's algorithm: *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6100
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6101
(* http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6102
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6103
local
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6104
  datatype stackSCC = StackSCC of set * (element * set) list;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6105
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6106
  val emptyStack = StackSCC (empty,[]);
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6107
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6108
  fun pushStack (StackSCC (elts,eltl)) elt =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6109
      StackSCC (add elts elt, (elt,elts) :: eltl);
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6110
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6111
  fun inStack elt (StackSCC (elts,_)) = member elt elts;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6112
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6113
  fun popStack root =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6114
      let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6115
        fun pop scc eltl =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6116
            case eltl of
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6117
              [] => raise Metis_Useful.Bug "Metis_ElementSet.popStack"
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6118
            | (elt,elts) :: eltl =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6119
              let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6120
                val scc = add scc elt
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6121
              in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6122
                if equalElement elt root then (scc, StackSCC (elts,eltl))
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6123
                else pop scc eltl
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6124
              end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6125
      in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6126
        fn sccs => fn StackSCC (_,eltl) =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6127
           let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6128
             val (scc,stack) = pop empty eltl
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6129
           in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6130
             (scc :: sccs, stack)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6131
           end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6132
      end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6133
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6134
  fun getIndex indices e : int =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6135
      case KM.peek indices e of
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6136
        SOME i => i
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6137
      | NONE => raise Metis_Useful.Bug "Metis_ElementSet.getIndex";
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6138
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6139
  fun isRoot indices lows e = getIndex indices e = getIndex lows e;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6140
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6141
  fun reduceIndex indices (e,i) =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6142
      let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6143
        val j = getIndex indices e
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6144
      in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6145
        if j <= i then indices else KM.insert indices (e,i)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6146
      end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6147
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6148
  fun tarjan children =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6149
      let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6150
        fun dfsVertex sccs callstack index indices lows stack elt =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6151
            let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6152
              val indices = KM.insert indices (elt,index)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6153
              and lows = KM.insert lows (elt,index)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6154
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6155
              val index = index + 1
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6156
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6157
              val stack = pushStack stack elt
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6158
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6159
              val chil = toList (children elt)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6160
            in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6161
              dfsSuccessors sccs callstack index indices lows stack elt chil
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6162
            end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6163
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6164
        and dfsSuccessors sccs callstack index indices lows stack elt chil =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6165
            case chil of
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6166
              [] =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6167
              let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6168
                val (sccs,stack) =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6169
                    if isRoot indices lows elt then popStack elt sccs stack
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6170
                    else (sccs,stack)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6171
              in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6172
                case callstack of
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6173
                  [] => (sccs,index,indices,lows)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6174
                | (p,elts) :: callstack =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6175
                  let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6176
                    val lows = reduceIndex lows (p, getIndex lows elt)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6177
                  in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6178
                    dfsSuccessors sccs callstack index indices lows stack p elts
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6179
                  end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6180
              end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6181
            | c :: chil =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6182
              case KM.peek indices c of
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6183
                NONE =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6184
                let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6185
                  val callstack = (elt,chil) :: callstack
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6186
                in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6187
                  dfsVertex sccs callstack index indices lows stack c
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6188
                end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6189
              | SOME cind =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6190
                let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6191
                  val lows =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6192
                      if inStack c stack then reduceIndex lows (elt,cind)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6193
                      else lows
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6194
                in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6195
                  dfsSuccessors sccs callstack index indices lows stack elt chil
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6196
                end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6197
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6198
        fun dfsRoots sccs index indices lows elts =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6199
            case elts of
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6200
              [] => sccs
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6201
            | elt :: elts =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6202
              if KM.inDomain elt indices then
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6203
                dfsRoots sccs index indices lows elts
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6204
              else
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6205
                let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6206
                  val callstack = []
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6207
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6208
                  val (sccs,index,indices,lows) =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6209
                      dfsVertex sccs callstack index indices lows emptyStack elt
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6210
                in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6211
                  dfsRoots sccs index indices lows elts
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6212
                end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6213
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6214
        val sccs = []
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6215
        and index = 0
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6216
        and indices = KM.new ()
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6217
        and lows = KM.new ()
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6218
      in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6219
        dfsRoots sccs index indices lows
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6220
      end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6221
in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6222
  fun preOrderSCC children roots =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6223
      let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6224
        val result = tarjan children (toList roots)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6225
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6226
(*BasicDebug
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6227
        val () =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6228
            if subset roots (unionList result) then ()
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6229
            else raise Metis_Useful.Bug "Metis_ElementSet.preOrderSCC: missing roots"
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6230
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6231
        val () =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6232
            if preOrderedSCC children result then ()
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6233
            else raise Metis_Useful.Bug "Metis_ElementSet.preOrderSCC: bad ordering"
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6234
*)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6235
      in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6236
        result
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6237
      end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6238
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6239
  fun postOrderSCC children roots =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6240
      let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6241
        val result = List.rev (tarjan children (toList roots))
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6242
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6243
(*BasicDebug
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6244
        val () =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6245
            if subset roots (unionList result) then ()
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6246
            else raise Metis_Useful.Bug "Metis_ElementSet.postOrderSCC: missing roots"
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6247
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6248
        val () =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6249
            if postOrderedSCC children result then ()
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6250
            else raise Metis_Useful.Bug "Metis_ElementSet.postOrderSCC: bad ordering"
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6251
*)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6252
      in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6253
        result
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6254
      end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6255
end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6256
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6257
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6258
(* Pretty-printing.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6259
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6260
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6261
fun toString set =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6262
    "{" ^ (if null set then "" else Int.toString (size set)) ^ "}";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6263
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6264
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6265
(* Iterators over sets                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6266
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6267
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6268
type iterator = unit KM.iterator;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6269
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6270
fun mkIterator (Metis_Set m) = KM.mkIterator m;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6271
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6272
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
  6273
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6274
fun readIterator iter =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6275
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6276
      val (elt,()) = KM.readIterator iter
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6277
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6278
      elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6279
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6280
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6281
fun advanceIterator iter = KM.advanceIterator iter;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6282
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6283
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6284
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6285
structure Metis_IntSet =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6286
Metis_ElementSet (Metis_IntMap);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6287
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6288
structure Metis_IntPairSet =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6289
Metis_ElementSet (Metis_IntPairMap);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6290
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6291
structure Metis_StringSet =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6292
Metis_ElementSet (Metis_StringMap);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6293
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6294
(**** Original file: src/Sharing.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6295
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6296
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6297
(* PRESERVING SHARING OF ML VALUES                                           *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6298
(* Copyright (c) 2005 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6299
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6300
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6301
signature Metis_Sharing =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6302
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6303
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6304
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6305
(* Option operations.                                                        *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6306
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6307
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6308
val mapOption : ('a -> 'a) -> 'a option -> 'a option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6309
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6310
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
  6311
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6312
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6313
(* List operations.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6314
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6315
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6316
val map : ('a -> 'a) -> 'a list -> 'a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6317
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6318
val revMap : ('a -> 'a) -> 'a list -> 'a list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6319
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6320
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
  6321
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6322
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
  6323
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6324
val updateNth : int * 'a -> 'a list -> 'a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6325
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6326
val setify : ''a list -> ''a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6327
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6328
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6329
(* Function caching.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6330
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6331
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6332
val cache : ('a * 'a -> order) -> ('a -> 'b) -> 'a -> 'b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6333
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6334
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6335
(* Hash consing.                                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6336
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6337
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6338
val hashCons : ('a * 'a -> order) -> 'a -> 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6339
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6340
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6341
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6342
(**** Original file: src/Sharing.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6343
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6344
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6345
(* PRESERVING SHARING OF ML VALUES                                           *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6346
(* Copyright (c) 2005 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6347
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6348
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6349
structure Metis_Sharing :> Metis_Sharing =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6350
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6351
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6352
infix ==
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6353
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6354
val op== = Metis_Portable.pointerEqual;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6355
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6356
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6357
(* Option operations.                                                        *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6358
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6359
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6360
fun mapOption f xo =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6361
    case xo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6362
      SOME x =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6363
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6364
        val y = f x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6365
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6366
        if x == y then xo else SOME y
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6367
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6368
    | NONE => xo;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6369
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6370
fun mapsOption f xo acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6371
    case xo of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6372
      SOME x =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6373
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6374
        val (y,acc) = f x acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6375
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6376
        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
  6377
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6378
    | NONE => (xo,acc);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6379
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6380
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6381
(* List operations.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6382
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6383
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6384
fun map f =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6385
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6386
      fun m ys ys_xs xs =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6387
          case xs of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6388
            [] => List.revAppend ys_xs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6389
          | x :: xs =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6390
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6391
              val y = f x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6392
              val ys = y :: ys
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6393
              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
  6394
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6395
              m ys ys_xs xs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6396
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6397
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6398
      fn xs => m [] ([],xs) xs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6399
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6400
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6401
fun maps f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6402
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6403
      fun m acc ys ys_xs xs =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6404
          case xs of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6405
            [] => (List.revAppend ys_xs, acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6406
          | x :: xs =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6407
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6408
              val (y,acc) = f x acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6409
              val ys = y :: ys
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6410
              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
  6411
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6412
              m acc ys ys_xs xs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6413
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6414
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6415
      fn xs => fn acc => m acc [] ([],xs) xs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6416
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6417
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6418
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6419
  fun revTails acc xs =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6420
      case xs of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6421
        [] => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6422
      | x :: xs' => revTails ((x,xs) :: acc) xs';
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6423
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6424
  fun revMap f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6425
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6426
        fun m ys same xxss =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6427
            case xxss of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6428
              [] => ys
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6429
            | (x,xs) :: xxss =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6430
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6431
                val y = f x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6432
                val same = same andalso x == y
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6433
                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
  6434
              in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6435
                m ys same xxss
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6436
              end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6437
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6438
        fn xs => m [] true (revTails [] xs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6439
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6440
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6441
  fun revMaps f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6442
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6443
        fun m acc ys same xxss =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6444
            case xxss of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6445
              [] => (ys,acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6446
            | (x,xs) :: xxss =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6447
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6448
                val (y,acc) = f x acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6449
                val same = same andalso x == y
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6450
                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
  6451
              in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6452
                m acc ys same xxss
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6453
              end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6454
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6455
        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
  6456
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6457
end;
23442
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
fun updateNth (n,x) l =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6460
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6461
      val (a,b) = Metis_Useful.revDivide l n
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6462
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6463
      case b of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6464
        [] => raise Subscript
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6465
      | 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
  6466
    end;
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 setify l =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6469
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6470
      val l' = Metis_Useful.setify l
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6471
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6472
      if length l' = length l then l else l'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6473
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6474
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6475
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6476
(* Function caching.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6477
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6478
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6479
fun cache cmp f =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6480
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6481
      val cache = Unsynchronized.ref (Metis_Map.new cmp)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6482
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6483
      fn a =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6484
         case Metis_Map.peek (!cache) a of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6485
           SOME b => b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6486
         | NONE =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6487
           let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6488
             val b = f a
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6489
             val () = cache := Metis_Map.insert (!cache) (a,b)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6490
           in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6491
             b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6492
           end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6493
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6494
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6495
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6496
(* Hash consing.                                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6497
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6498
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6499
fun hashCons cmp = cache cmp Metis_Useful.I;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6500
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6501
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6502
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6503
(**** 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
  6504
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6505
(* ========================================================================= *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6506
(* A POSSIBLY-INFINITE STREAM DATATYPE FOR ML                                *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6507
(* Copyright (c) 2001 Joe Leslie-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
  6508
(* ========================================================================= *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6509
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6510
signature Metis_Stream =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6511
sig
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6512
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6513
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6514
(* The stream type.                                                          *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6515
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6516
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6517
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
  6518
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6519
(* 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
  6520
(* 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
  6521
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6522
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6523
(* Metis_Stream constructors.                                                      *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6524
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6525
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6526
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
  6527
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6528
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
  6529
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6530
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
  6531
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6532
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6533
(* 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
  6534
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6535
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6536
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
  6537
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6538
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
  6539
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6540
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
  6541
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6542
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
  6543
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6544
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
  6545
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6546
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
  6547
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6548
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
  6549
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6550
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
  6551
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6552
val maps :
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6553
    ('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
  6554
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6555
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
  6556
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6557
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
  6558
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6559
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
  6560
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6561
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
  6562
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6563
val unfold : ('b -> ('a * 'b) option) -> 'b -> 'a stream
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6564
39433
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6565
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6566
(* 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
  6567
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6568
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6569
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
  6570
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6571
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
  6572
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6573
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
  6574
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6575
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
  6576
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6577
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
  6578
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6579
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
  6580
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6581
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
  6582
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6583
val mapsPartial :
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6584
    ('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
  6585
    'a stream -> 'b stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6586
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6587
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
  6588
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6589
val mapsConcat :
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6590
    ('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
  6591
    'a stream -> 'b stream
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6592
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6593
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6594
(* Metis_Stream operations.                                                        *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6595
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6596
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6597
val primes : int stream
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6598
39433
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6599
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
  6600
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6601
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
  6602
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6603
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
  6604
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6605
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
  6606
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6607
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
  6608
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6609
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
  6610
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6611
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
  6612
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6613
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
  6614
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6615
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
  6616
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6617
end
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6618
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6619
(**** 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
  6620
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6621
(* ========================================================================= *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6622
(* A POSSIBLY-INFINITE STREAM DATATYPE FOR ML                                *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6623
(* Copyright (c) 2001 Joe Leslie-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
  6624
(* ========================================================================= *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6625
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6626
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
  6627
struct
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6628
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6629
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
  6630
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6631
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
  6632
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6633
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
  6634
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6635
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6636
(* The stream type.                                                          *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6637
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6638
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6639
datatype 'a stream =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6640
    Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6641
  | 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
  6642
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6643
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6644
(* Metis_Stream constructors.                                                      *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6645
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6646
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6647
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
  6648
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6649
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
  6650
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6651
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
  6652
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6653
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6654
(* 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
  6655
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6656
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6657
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
  6658
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6659
fun null Nil = true
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6660
  | null (Cons _) = false;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6661
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6662
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
  6663
  | hd (Cons (h,_)) = h;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6664
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6665
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
  6666
  | tl (Cons (_,t)) = t ();
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6667
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6668
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
  6669
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6670
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
  6671
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6672
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
  6673
  | 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
  6674
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6675
fun map f =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6676
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6677
      fun m Nil = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6678
        | 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
  6679
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6680
      m
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6681
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6682
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6683
fun maps f g =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6684
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6685
      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
  6686
        | 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
  6687
          let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6688
            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
  6689
          in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6690
            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
  6691
          end
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6692
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6693
      mm
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6694
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6695
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6696
fun zipwith f =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6697
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6698
      fun z Nil _ = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6699
        | z _ Nil = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6700
        | 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
  6701
          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
  6702
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6703
      z
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6704
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6705
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6706
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
  6707
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6708
fun take 0 _ = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6709
  | 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
  6710
  | 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
  6711
  | 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
  6712
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6713
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
  6714
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6715
fun unfold f =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6716
    let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6717
      fun next b () =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6718
          case f b of
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6719
            NONE => Nil
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6720
          | SOME (a,b) => Cons (a, next b)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6721
    in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6722
      fn b => next b ()
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6723
    end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6724
39433
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6725
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6726
(* 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
  6727
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6728
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6729
local
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6730
  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
  6731
    | 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
  6732
in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6733
  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
  6734
end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6735
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6736
fun exists pred =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6737
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6738
      fun f Nil = false
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6739
        | 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
  6740
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6741
      f
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6742
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6743
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6744
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
  6745
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6746
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
  6747
  | 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
  6748
    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
  6749
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6750
fun foldl f =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6751
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6752
      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
  6753
        | 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
  6754
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6755
      fold
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6756
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6757
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6758
fun concat Nil = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6759
  | 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
  6760
  | 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
  6761
    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
  6762
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6763
fun mapPartial f =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6764
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6765
      fun mp Nil = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6766
        | mp (Cons (h,t)) =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6767
          case f h of
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6768
            NONE => mp (t ())
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6769
          | 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
  6770
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6771
      mp
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6772
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6773
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6774
fun mapsPartial f g =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6775
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6776
      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
  6777
        | 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
  6778
          let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6779
            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
  6780
          in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6781
            case h of
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6782
              NONE => mp s (t ())
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6783
            | 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
  6784
          end
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6785
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6786
      mp
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6787
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6788
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6789
fun mapConcat f =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6790
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6791
      fun mc Nil = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6792
        | 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
  6793
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6794
      mc
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6795
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6796
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6797
fun mapsConcat f g =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6798
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6799
      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
  6800
        | 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
  6801
          let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6802
            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
  6803
          in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6804
            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
  6805
          end
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6806
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6807
      mc
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6808
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6809
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6810
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6811
(* Metis_Stream operations.                                                        *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6812
(* ------------------------------------------------------------------------- *)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6813
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6814
val primes =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6815
    let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6816
      fun next s = SOME (Metis_Useful.nextSieve s)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6817
    in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6818
      unfold next Metis_Useful.initSieve
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6819
    end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6820
39433
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6821
fun memoize Nil = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6822
  | 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
  6823
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6824
fun concatList [] = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6825
  | 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
  6826
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6827
local
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  6828
  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
  6829
    | 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
  6830
in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6831
  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
  6832
end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6833
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6834
fun fromList [] = Nil
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6835
  | 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
  6836
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6837
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
  6838
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6839
fun toString s = String.implode (toList s);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6840
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6841
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
  6842
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6843
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
  6844
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6845
      val (h,close) =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6846
          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
  6847
          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
  6848
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6849
      fun toFile Nil = ()
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6850
        | 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
  6851
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6852
      val () = toFile s
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6853
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6854
      close h
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6855
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6856
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6857
fun fromTextFile {filename = f} =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6858
    let
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6859
      val (h,close) =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6860
          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
  6861
          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
  6862
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6863
      fun strm () =
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6864
          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
  6865
            NONE => (close h; Nil)
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6866
          | 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
  6867
    in
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6868
      memoize (strm ())
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6869
    end;
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6870
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6871
end
3e41c9d29769 make "metis.ML" building process slightly more robust by eliminating the need for "FILES";
blanchet
parents: 39429
diff changeset
  6872
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6873
(**** Original file: src/Heap.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6874
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6875
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6876
(* A HEAP DATATYPE FOR ML                                                    *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6877
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6878
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6879
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6880
signature Metis_Heap =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6881
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6882
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6883
type 'a heap
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6884
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6885
val new : ('a * 'a -> order) -> 'a heap
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6886
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6887
val add : 'a heap -> 'a -> 'a heap
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6888
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6889
val null : 'a heap -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6890
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6891
val top : 'a heap -> 'a  (* raises Empty *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6892
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6893
val remove : 'a heap -> 'a * 'a heap  (* raises Empty *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6894
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6895
val size : 'a heap -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6896
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6897
val app : ('a -> unit) -> 'a heap -> unit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6898
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6899
val toList : 'a heap -> 'a list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6900
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6901
val toStream : 'a heap -> 'a Metis_Stream.stream
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6902
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6903
val toString : 'a heap -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6904
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6905
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6906
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6907
(**** Original file: src/Heap.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6908
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6909
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6910
(* A HEAP DATATYPE FOR ML                                                    *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6911
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6912
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6913
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6914
structure Metis_Heap :> Metis_Heap =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6915
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6916
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6917
(* Leftist heaps as in Purely Functional Data Structures, by Chris Okasaki *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6918
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6919
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
  6920
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6921
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
  6922
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6923
fun rank E = 0
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6924
  | rank (T (r,_,_,_)) = r;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6925
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6926
fun makeT (x,a,b) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6927
  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
  6928
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6929
fun merge cmp =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6930
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6931
      fun mrg (h,E) = h
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6932
        | mrg (E,h) = h
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6933
        | 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
  6934
          case cmp (x,y) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6935
            GREATER => makeT (y, a2, mrg (h1,b2))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6936
          | _ => makeT (x, a1, mrg (b1,h2))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6937
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6938
      mrg
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6939
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6940
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6941
fun new cmp = Metis_Heap (cmp,0,E);
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
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
  6944
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6945
fun size (Metis_Heap (_, n, _)) = n;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6946
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6947
fun null h = size h = 0;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6948
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6949
fun top (Metis_Heap (_,_,E)) = raise Empty
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6950
  | top (Metis_Heap (_, _, T (_,x,_,_))) = x;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6951
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6952
fun remove (Metis_Heap (_,_,E)) = raise Empty
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6953
  | 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
  6954
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6955
fun app f =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6956
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6957
      fun ap [] = ()
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6958
        | ap (E :: rest) = ap rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6959
        | 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
  6960
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6961
      fn Metis_Heap (_,_,a) => ap [a]
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6962
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6963
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6964
fun toList h =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6965
    if null h then []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6966
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6967
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6968
        val (x,h) = remove h
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6969
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6970
        x :: toList h
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6971
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6972
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6973
fun toStream h =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6974
    if null h then Metis_Stream.Nil
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6975
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6976
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6977
        val (x,h) = remove h
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6978
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6979
        Metis_Stream.Cons (x, fn () => toStream h)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6980
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6981
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6982
fun toString h =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6983
    "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
  6984
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6985
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6986
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6987
(**** Original file: src/Print.sig ****)
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
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6990
(* PRETTY-PRINTING                                                           *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  6991
(* Copyright (c) 2008 Joe Leslie-Hurd, distributed under the BSD License     *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6992
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  6993
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  6994
signature Metis_Print =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6995
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6996
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  6997
(* ------------------------------------------------------------------------- *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6998
(* Escaping strings.                                                         *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  6999
(* ------------------------------------------------------------------------- *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7000
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7001
val escapeString : {escape : char list} -> string -> string
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7002
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7003
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7004
(* A type of pretty-printers.                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7005
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7006
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7007
type ppstream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7008
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7009
type 'a pp = 'a -> ppstream
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7010
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7011
val skip : ppstream
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7012
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7013
val sequence : ppstream -> ppstream -> ppstream
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7014
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7015
val duplicate : int -> ppstream -> ppstream
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7016
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7017
val program : ppstream list -> ppstream
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7018
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  7019
val stream : ppstream Metis_Stream.stream -> ppstream
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7020
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7021
val ppPpstream : ppstream pp
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7022
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7023
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7024
(* Pretty-printing blocks.                                                   *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7025
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7026
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7027
datatype style = Consistent | Inconsistent
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7028
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7029
datatype block =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7030
    Block of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7031
      {style : style,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7032
       indent : int}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7033
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7034
val styleBlock : block -> style
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7035
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7036
val indentBlock : block -> int
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7037
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7038
val block : block -> ppstream -> ppstream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7039
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7040
val consistentBlock : int -> ppstream list -> ppstream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7041
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7042
val inconsistentBlock : int -> ppstream list -> ppstream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7043
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7044
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7045
(* Words are unbreakable strings annotated with their effective size.        *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7046
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7047
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7048
datatype word = Word of {word : string, size : int}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7049
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7050
val mkWord : string -> word
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7051
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7052
val emptyWord : word
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7053
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7054
val charWord : char -> word
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7055
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7056
val ppWord : word pp
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7057
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7058
val space : ppstream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7059
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7060
val spaces : int -> ppstream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7061
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7062
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7063
(* Possible line breaks.                                                     *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7064
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7065
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7066
datatype break = Break of {size : int, extraIndent : int}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7067
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7068
val mkBreak : int -> break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7069
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7070
val ppBreak : break pp
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7071
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7072
val break : ppstream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7073
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7074
val breaks : int -> ppstream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7075
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7076
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7077
(* Forced line breaks.                                                       *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7078
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7079
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7080
val newline : ppstream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7081
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7082
val newlines : int -> ppstream
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7083
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7084
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7085
(* Pretty-printer combinators.                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7086
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7087
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7088
val ppMap : ('a -> 'b) -> 'b pp -> 'a pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7089
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7090
val ppBracket : string -> string -> 'a pp -> 'a pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7091
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7092
val ppOp : string -> ppstream
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7093
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7094
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
  7095
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7096
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
  7097
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7098
val ppOpList : string -> 'a pp -> 'a list pp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7099
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  7100
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
  7101
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7102
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7103
(* Pretty-printers for common types.                                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7104
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7105
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7106
val ppChar : char pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7107
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7108
val ppString : string pp
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7109
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7110
val ppEscapeString : {escape : char list} -> string pp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7111
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7112
val ppUnit : unit pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7113
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7114
val ppBool : bool pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7115
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7116
val ppInt : int pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7117
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7118
val ppPrettyInt : int pp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7119
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7120
val ppReal : real pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7121
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7122
val ppPercent : real pp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7123
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7124
val ppOrder : order pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7125
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7126
val ppList : 'a pp -> 'a list pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7127
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  7128
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
  7129
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7130
val ppOption : 'a pp -> 'a option pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7131
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7132
val ppPair : 'a pp -> 'b pp -> ('a * 'b) pp
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7133
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  7134
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
  7135
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  7136
val ppException : exn pp
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  7137
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7138
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7139
(* Pretty-printing infix operators.                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7140
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7141
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7142
type token = string
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7143
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7144
datatype assoc =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7145
    LeftAssoc
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7146
  | NonAssoc
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7147
  | RightAssoc
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7148
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7149
datatype infixes =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7150
    Infixes of
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7151
      {token : token,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7152
       precedence : int,
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7153
       assoc : assoc} list
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7154
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  7155
val tokensInfixes : infixes -> Metis_StringSet.set
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7156
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7157
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
  7158
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7159
val ppInfixes :
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7160
    infixes ->
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7161
    ('a -> (token * 'a * 'a) option) -> ('a * token) pp ->
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7162
    ('a * bool) pp -> ('a * bool) pp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7163
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7164
(* ------------------------------------------------------------------------- *)
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7165
(* Pretty-printer rendering.                                                 *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7166
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7167
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7168
val render :
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7169
    {lineLength : int option} -> ppstream ->
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7170
    {indent : int, line : string} Metis_Stream.stream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7171
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7172
val toStringWithLineLength :
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7173
    {lineLength : int option} -> 'a pp -> 'a -> string
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7174
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7175
val toStreamWithLineLength :
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7176
    {lineLength : int option} -> 'a pp -> 'a -> string Metis_Stream.stream
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7177
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7178
val toLine : 'a pp -> 'a -> string
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7179
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7180
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7181
(* 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
  7182
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7183
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7184
val lineLength : int Unsynchronized.ref
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7185
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7186
val toString : 'a pp -> 'a -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7187
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  7188
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
  7189
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7190
val trace : 'a pp -> string -> 'a -> unit
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7191
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7192
end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7193
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7194
(**** Original file: src/Print.sml ****)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7195
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7196
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7197
(* PRETTY-PRINTING                                                           *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  7198
(* Copyright (c) 2008 Joe Leslie-Hurd, distributed under the BSD License     *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7199
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7200
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  7201
structure Metis_Print :> Metis_Print =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7202
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7203
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  7204
open Metis_Useful;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7205
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7206
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7207
(* Constants.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7208
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7209
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7210
val initialLineLength = 75;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7211
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7212
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7213
(* Helper functions.                                                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7214
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7215
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7216
fun revAppend xs s =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7217
    case xs of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7218
      [] => s ()
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  7219
    | 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
  7220
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7221
fun revConcat strm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7222
    case strm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  7223
      Metis_Stream.Nil => Metis_Stream.Nil
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7224
    | 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
  7225
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7226
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7227
  fun calcSpaces n = nChars #" " n;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7228
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7229
  val cacheSize = 2 * initialLineLength;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7230
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7231
  val cachedSpaces = Vector.tabulate (cacheSize,calcSpaces);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7232
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7233
  fun nSpaces n =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7234
      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
  7235
      else calcSpaces n;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7236
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7237
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7238
(* ------------------------------------------------------------------------- *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7239
(* Escaping strings.                                                         *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7240
(* ------------------------------------------------------------------------- *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7241
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7242
fun escapeString {escape} =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7243
    let
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  7244
      val escapeMap = List.map (fn c => (c, "\\" ^ str c)) escape
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7245
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7246
      fun escapeChar c =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7247
          case c of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7248
            #"\\" => "\\\\"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7249
          | #"\n" => "\\n"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7250
          | #"\t" => "\\t"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7251
          | _ =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7252
            case List.find (equal c o fst) escapeMap of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7253
              SOME (_,s) => s
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7254
            | NONE => str c
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7255
    in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7256
      String.translate escapeChar
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7257
    end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7258
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7259
(* ------------------------------------------------------------------------- *)
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7260
(* Pretty-printing blocks.                                                   *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7261
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7262
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7263
datatype style = Consistent | Inconsistent;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7264
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7265
datatype block =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7266
    Block of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7267
      {style : style,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7268
       indent : int};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7269
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7270
fun toStringStyle style =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7271
    case style of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7272
      Consistent => "Consistent"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7273
    | Inconsistent => "Inconsistent";
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7274
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7275
fun isConsistentStyle style =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7276
    case style of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7277
      Consistent => true
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7278
    | Inconsistent => false;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7279
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7280
fun isInconsistentStyle style =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7281
    case style of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7282
      Inconsistent => true
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7283
    | Consistent => false;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7284
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7285
fun mkBlock style indent =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7286
    Block
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7287
      {style = style,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7288
       indent = indent};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7289
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7290
val mkConsistentBlock = mkBlock Consistent;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7291
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7292
val mkInconsistentBlock = mkBlock Inconsistent;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7293
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7294
fun styleBlock (Block {style = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7295
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7296
fun indentBlock (Block {indent = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7297
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7298
fun isConsistentBlock block = isConsistentStyle (styleBlock block);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7299
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7300
fun isInconsistentBlock block = isInconsistentStyle (styleBlock block);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7301
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7302
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7303
(* Words are unbreakable strings annotated with their effective size.        *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7304
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7305
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7306
datatype word = Word of {word : string, size : int};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7307
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7308
fun mkWord s = Word {word = s, size = String.size s};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7309
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7310
val emptyWord = mkWord "";
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7311
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7312
fun charWord c = mkWord (str c);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7313
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7314
fun spacesWord i = Word {word = nSpaces i, size = i};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7315
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7316
fun sizeWord (Word {size = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7317
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7318
fun renderWord (Word {word = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7319
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7320
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7321
(* Possible line breaks.                                                     *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7322
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7323
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7324
datatype break = Break of {size : int, extraIndent : int};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7325
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7326
fun mkBreak n = Break {size = n, extraIndent = 0};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7327
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7328
fun sizeBreak (Break {size = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7329
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7330
fun extraIndentBreak (Break {extraIndent = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7331
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7332
fun renderBreak b = nSpaces (sizeBreak b);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7333
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7334
fun updateSizeBreak size break =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7335
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7336
      val Break {size = _, extraIndent} = break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7337
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7338
      Break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7339
        {size = size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7340
         extraIndent = extraIndent}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7341
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7342
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7343
fun appendBreak break1 break2 =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7344
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7345
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7346
      val () = warn "merging consecutive pretty-printing breaks"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7347
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7348
      val Break {size = size1, extraIndent = extraIndent1} = break1
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7349
      and Break {size = size2, extraIndent = extraIndent2} = break2
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7350
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7351
      val size = size1 + size2
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7352
      and extraIndent = Int.max (extraIndent1,extraIndent2)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7353
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7354
      Break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7355
        {size = size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7356
         extraIndent = extraIndent}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7357
    end;
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7358
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7359
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7360
(* A type of pretty-printers.                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7361
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7362
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7363
datatype step =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7364
    BeginBlock of block
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7365
  | EndBlock
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7366
  | AddWord of word
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7367
  | AddBreak of break
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7368
  | AddNewline;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7369
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7370
type ppstream = step Metis_Stream.stream;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7371
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7372
type 'a pp = 'a -> ppstream;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7373
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7374
fun toStringStep step =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7375
    case step of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7376
      BeginBlock _ => "BeginBlock"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7377
    | EndBlock => "EndBlock"
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7378
    | AddWord _ => "Word"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7379
    | AddBreak _ => "Break"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7380
    | AddNewline => "Newline";
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  7381
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  7382
val skip : ppstream = Metis_Stream.Nil;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  7383
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  7384
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
  7385
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  7386
local
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  7387
  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
  7388
in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7389
  fun duplicate n pp : ppstream =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7390
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7391
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7392
        val () = if 0 <= n then () else raise Bug "Metis_Print.duplicate"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7393
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7394
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7395
        if n = 0 then skip else dup pp n ()
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7396
      end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7397
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7398
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  7399
val program : ppstream list -> ppstream = Metis_Stream.concatList;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  7400
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  7401
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
  7402
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7403
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7404
(* Pretty-printing blocks.                                                   *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7405
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7406
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7407
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7408
  fun beginBlock b = Metis_Stream.singleton (BeginBlock b);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7409
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7410
  val endBlock = Metis_Stream.singleton EndBlock;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7411
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7412
  fun block b pp = program [beginBlock b, pp, endBlock];
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7413
end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7414
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7415
fun consistentBlock i pps = block (mkConsistentBlock i) (program pps);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7416
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7417
fun inconsistentBlock i pps = block (mkInconsistentBlock i) (program pps);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7418
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7419
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7420
(* Words are unbreakable strings annotated with their effective size.        *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7421
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7422
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7423
fun ppWord w = Metis_Stream.singleton (AddWord w);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7424
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7425
val space = ppWord (mkWord " ");
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7426
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7427
fun spaces i = ppWord (spacesWord i);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7428
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7429
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7430
(* Possible line breaks.                                                     *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7431
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7432
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7433
fun ppBreak b = Metis_Stream.singleton (AddBreak b);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7434
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7435
fun breaks i = ppBreak (mkBreak i);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7436
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7437
val break = breaks 1;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7438
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7439
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7440
(* Forced line breaks.                                                       *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7441
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7442
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7443
val newline = Metis_Stream.singleton AddNewline;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7444
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7445
fun newlines i = duplicate i newline;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7446
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  7447
(* ------------------------------------------------------------------------- *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7448
(* Pretty-printer combinators.                                               *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7449
(* ------------------------------------------------------------------------- *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7450
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7451
fun ppMap f ppB a : ppstream = ppB (f a);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7452
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7453
fun ppBracket' l r ppA a =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7454
    let
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7455
      val n = sizeWord l
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7456
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7457
      inconsistentBlock n
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7458
        [ppWord l,
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7459
         ppA a,
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7460
         ppWord r]
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7461
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7462
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7463
fun ppOp' w = sequence (ppWord w) break;
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7464
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7465
fun ppOp2' ab ppA ppB (a,b) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7466
    inconsistentBlock 0
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7467
      [ppA a,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7468
       ppOp' ab,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7469
       ppB b];
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7470
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7471
fun ppOp3' ab bc ppA ppB ppC (a,b,c) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7472
    inconsistentBlock 0
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7473
      [ppA a,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7474
       ppOp' ab,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7475
       ppB b,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7476
       ppOp' bc,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7477
       ppC c];
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7478
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7479
fun ppOpList' s ppA =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7480
    let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7481
      fun ppOpA a = sequence (ppOp' s) (ppA a)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7482
    in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7483
      fn [] => skip
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7484
       | h :: t => inconsistentBlock 0 (ppA h :: List.map ppOpA t)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7485
    end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7486
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7487
fun ppOpStream' s ppA =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7488
    let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7489
      fun ppOpA a = sequence (ppOp' s) (ppA a)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7490
    in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7491
      fn Metis_Stream.Nil => skip
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7492
       | Metis_Stream.Cons (h,t) =>
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7493
         inconsistentBlock 0
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7494
           [ppA h,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7495
            Metis_Stream.concat (Metis_Stream.map ppOpA (t ()))]
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7496
    end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7497
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7498
fun ppBracket l r = ppBracket' (mkWord l) (mkWord r);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7499
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7500
fun ppOp s = ppOp' (mkWord s);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7501
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7502
fun ppOp2 ab = ppOp2' (mkWord ab);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7503
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7504
fun ppOp3 ab bc = ppOp3' (mkWord ab) (mkWord bc);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7505
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7506
fun ppOpList s = ppOpList' (mkWord s);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7507
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7508
fun ppOpStream s = ppOpStream' (mkWord s);
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7509
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7510
(* ------------------------------------------------------------------------- *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7511
(* Pretty-printers for common types.                                         *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7512
(* ------------------------------------------------------------------------- *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7513
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7514
fun ppChar c = ppWord (charWord c);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7515
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7516
fun ppString s = ppWord (mkWord s);
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7517
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7518
fun ppEscapeString escape = ppMap (escapeString escape) ppString;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7519
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7520
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7521
  val pp = ppString "()";
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7522
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7523
  fun ppUnit () = pp;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7524
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7525
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7526
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7527
  val ppTrue = ppString "true"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7528
  and ppFalse = ppString "false";
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7529
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7530
  fun ppBool b = if b then ppTrue else ppFalse;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7531
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7532
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7533
val ppInt = ppMap Int.toString ppString;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7534
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7535
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7536
  val ppNeg = ppString "~"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7537
  and ppSep = ppString ","
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7538
  and ppZero = ppString "0"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7539
  and ppZeroZero = ppString "00";
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7540
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7541
  fun ppIntBlock i =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7542
      if i < 10 then sequence ppZeroZero (ppInt i)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7543
      else if i < 100 then sequence ppZero (ppInt i)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7544
      else ppInt i;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7545
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7546
  fun ppIntBlocks i =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7547
      if i < 1000 then ppInt i
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7548
      else sequence (ppIntBlocks (i div 1000))
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7549
             (sequence ppSep (ppIntBlock (i mod 1000)));
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7550
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7551
  fun ppPrettyInt i =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7552
      if i < 0 then sequence ppNeg (ppIntBlocks (~i))
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7553
      else ppIntBlocks i;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7554
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7555
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7556
val ppReal = ppMap Real.toString ppString;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7557
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7558
val ppPercent = ppMap percentToString ppString;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7559
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7560
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7561
  val ppLess = ppString "Less"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7562
  and ppEqual = ppString "Equal"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7563
  and ppGreater = ppString "Greater";
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7564
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7565
  fun ppOrder ord =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7566
      case ord of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7567
        LESS => ppLess
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7568
      | EQUAL => ppEqual
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7569
      | GREATER => ppGreater;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7570
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7571
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7572
local
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7573
  val left = mkWord "["
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7574
  and right = mkWord "]"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7575
  and sep = mkWord ",";
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7576
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7577
  fun ppList ppX xs = ppBracket' left right (ppOpList' sep ppX) xs;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7578
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7579
  fun ppStream ppX xs = ppBracket' left right (ppOpStream' sep ppX) xs;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7580
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7581
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7582
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7583
  val ppNone = ppString "-";
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7584
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7585
  fun ppOption ppX xo =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7586
      case xo of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7587
        SOME x => ppX x
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7588
      | NONE => ppNone;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7589
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7590
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7591
local
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7592
  val left = mkWord "("
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7593
  and right = mkWord ")"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7594
  and sep = mkWord ",";
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7595
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7596
  fun ppPair ppA ppB =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7597
      ppBracket' left right (ppOp2' sep ppA ppB);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7598
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7599
  fun ppTriple ppA ppB ppC =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7600
      ppBracket' left right (ppOp3' sep sep ppA ppB ppC);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7601
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7602
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  7603
fun ppException e = ppString (exnMessage e);
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  7604
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7605
(* ------------------------------------------------------------------------- *)
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7606
(* A type of pretty-printers.                                                *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7607
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7608
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7609
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7610
  val ppStepType = ppMap toStringStep ppString;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7611
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7612
  val ppStyle = ppMap toStringStyle ppString;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7613
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7614
  val ppBlockInfo =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7615
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7616
        val sep = mkWord " "
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7617
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7618
        fn Block {style = s, indent = i} =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7619
           program [ppStyle s, ppWord sep, ppInt i]
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7620
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7621
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7622
  val ppWordInfo =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7623
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7624
        val left = mkWord "\""
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7625
        and right = mkWord "\""
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7626
        and escape = {escape = [#"\""]}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7627
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7628
        val pp = ppBracket' left right (ppEscapeString escape)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7629
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7630
        fn Word {word = s, size = n} =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7631
           if size s = n then pp s else ppPair pp ppInt (s,n)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7632
      end;
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 ppBreakInfo =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7635
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7636
        val sep = mkWord "+"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7637
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7638
        fn Break {size = n, extraIndent = k} =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7639
           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
  7640
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7641
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7642
  fun ppStep step =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7643
      inconsistentBlock 2
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7644
        (ppStepType step ::
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7645
         (case step of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7646
            BeginBlock b =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7647
              [break,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7648
               ppBlockInfo b]
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7649
          | EndBlock => []
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7650
          | AddWord w =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7651
              [break,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7652
               ppWordInfo w]
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7653
          | AddBreak b =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7654
              [break,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7655
               ppBreakInfo b]
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7656
          | AddNewline => []));
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
  val ppPpstream = ppStream ppStep;
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
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7661
(* ------------------------------------------------------------------------- *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7662
(* Pretty-printing infix operators.                                          *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7663
(* ------------------------------------------------------------------------- *)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7664
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7665
type token = string;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7666
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7667
datatype assoc =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7668
    LeftAssoc
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7669
  | NonAssoc
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7670
  | RightAssoc;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7671
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7672
datatype infixes =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7673
    Infixes of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7674
      {token : token,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7675
       precedence : int,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7676
       assoc : assoc} list;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7677
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7678
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7679
  fun comparePrecedence (io1,io2) =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7680
      let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7681
        val {token = _, precedence = p1, assoc = _} = io1
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7682
        and {token = _, precedence = p2, assoc = _} = io2
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7683
      in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7684
        Int.compare (p2,p1)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7685
      end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7686
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7687
  fun equalAssoc a a' =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7688
      case a of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7689
        LeftAssoc => (case a' of LeftAssoc => true | _ => false)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7690
      | NonAssoc => (case a' of NonAssoc => true | _ => false)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7691
      | RightAssoc => (case a' of RightAssoc => true | _ => false);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7692
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7693
  fun new t a acc = {tokens = Metis_StringSet.singleton t, assoc = a} :: acc;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7694
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7695
  fun add t a' acc =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7696
      case acc of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7697
        [] => raise Bug "Metis_Print.layerInfixes: null"
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7698
      | {tokens = ts, assoc = a} :: acc =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7699
        if equalAssoc a a' then {tokens = Metis_StringSet.add ts t, assoc = a} :: acc
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7700
        else raise Bug "Metis_Print.layerInfixes: mixed assocs";
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7701
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7702
  fun layer ({token = t, precedence = p, assoc = a}, (acc,p')) =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7703
      let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7704
        val acc = if p = p' then add t a acc else new t a acc
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7705
      in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7706
        (acc,p)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7707
      end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7708
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7709
  fun layerInfixes (Infixes ios) =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7710
      case sort comparePrecedence ios of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7711
        [] => []
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7712
      | {token = t, precedence = p, assoc = a} :: ios =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7713
        let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7714
          val acc = new t a []
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7715
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7716
          val (acc,_) = List.foldl layer (acc,p) ios
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7717
        in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7718
          acc
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7719
        end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7720
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7721
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7722
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7723
  fun add ({tokens = ts, assoc = _}, tokens) = Metis_StringSet.union ts tokens;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7724
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7725
  fun tokensLayeredInfixes l = List.foldl add Metis_StringSet.empty l;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7726
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7727
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7728
fun tokensInfixes ios = tokensLayeredInfixes (layerInfixes ios);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7729
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7730
fun destInfixOp dest tokens tm =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7731
    case dest tm of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7732
      NONE => NONE
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7733
    | 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
  7734
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7735
fun ppLayeredInfixes dest ppTok {tokens,assoc} ppLower ppSub =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7736
    let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7737
      fun isLayer t = Metis_StringSet.member t tokens
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7738
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7739
      fun ppTerm aligned (tm,r) =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7740
          case dest tm of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7741
            NONE => ppSub (tm,r)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7742
          | SOME (t,a,b) =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7743
            if aligned andalso isLayer t then ppLayer (tm,t,a,b,r)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7744
            else ppLower (tm,t,a,b,r)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7745
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7746
      and ppLeft tm_r =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7747
          let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7748
            val aligned = case assoc of LeftAssoc => true | _ => false
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7749
          in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7750
            ppTerm aligned tm_r
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7751
          end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7752
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7753
      and ppLayer (tm,t,a,b,r) =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7754
          program
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7755
            [ppLeft (a,true),
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7756
             ppTok (tm,t),
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7757
             ppRight (b,r)]
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7758
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7759
      and ppRight tm_r =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7760
          let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7761
            val aligned = case assoc of RightAssoc => true | _ => false
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7762
          in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7763
            ppTerm aligned tm_r
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7764
          end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7765
    in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7766
      fn tm_t_a_b_r as (_,t,_,_,_) =>
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7767
         if isLayer t then inconsistentBlock 0 [ppLayer tm_t_a_b_r]
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7768
         else ppLower tm_t_a_b_r
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7769
    end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7770
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7771
local
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7772
  val leftBrack = mkWord "("
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7773
  and rightBrack = mkWord ")";
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7774
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7775
  fun ppInfixes ops =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7776
      let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7777
        val layers = layerInfixes ops
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7778
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7779
        val toks = tokensLayeredInfixes layers
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7780
      in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7781
        fn dest => fn ppTok => fn ppSub =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7782
           let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7783
             fun destOp tm = destInfixOp dest toks tm
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7784
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7785
             fun ppInfix tm_t_a_b_r = ppLayers layers tm_t_a_b_r
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7786
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7787
             and ppLayers ls (tm,t,a,b,r) =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7788
                 case ls of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7789
                   [] =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7790
                   ppBracket' leftBrack rightBrack ppInfix (tm,t,a,b,false)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7791
                 | l :: ls =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7792
                   let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7793
                     val ppLower = ppLayers ls
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7794
                   in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7795
                     ppLayeredInfixes destOp ppTok l ppLower ppSub (tm,t,a,b,r)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7796
                   end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7797
           in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7798
             fn (tm,r) =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7799
                case destOp tm of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7800
                  SOME (t,a,b) => ppInfix (tm,t,a,b,r)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7801
                | NONE => ppSub (tm,r)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7802
           end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7803
      end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7804
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7805
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  7806
(* ------------------------------------------------------------------------- *)
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7807
(* A type of output lines.                                                   *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7808
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7809
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7810
type line = {indent : int, line : string};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7811
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7812
val emptyLine =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7813
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7814
      val indent = 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7815
      and line = ""
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7816
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7817
      {indent = indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7818
       line = line}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7819
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7820
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7821
fun addEmptyLine lines = emptyLine :: lines;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7822
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7823
fun addLine lines indent line = {indent = indent, line = line} :: lines;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7824
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7825
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7826
(* Pretty-printer rendering.                                                 *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7827
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7828
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7829
datatype chunk =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7830
    WordChunk of word
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7831
  | BreakChunk of break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7832
  | FrameChunk of frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7833
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7834
and frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7835
    Frame of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7836
      {block : block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7837
       broken : bool,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7838
       indent : int,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7839
       size : int,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7840
       chunks : chunk list};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7841
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7842
datatype state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7843
    State of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7844
      {lineIndent : int,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7845
       lineSize : int,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7846
       stack : frame list};
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7847
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7848
fun blockFrame (Frame {block = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7849
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7850
fun brokenFrame (Frame {broken = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7851
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7852
fun indentFrame (Frame {indent = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7853
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7854
fun sizeFrame (Frame {size = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7855
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7856
fun chunksFrame (Frame {chunks = x, ...}) = x;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7857
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7858
fun styleFrame frame = styleBlock (blockFrame frame);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7859
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7860
fun isConsistentFrame frame = isConsistentBlock (blockFrame frame);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7861
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7862
fun breakingFrame frame = isConsistentFrame frame andalso brokenFrame frame;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7863
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7864
fun sizeChunk chunk =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7865
    case chunk of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7866
      WordChunk w => sizeWord w
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7867
    | BreakChunk b => sizeBreak b
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7868
    | FrameChunk f => sizeFrame f;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7869
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7870
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7871
  fun add (c,acc) = sizeChunk c + acc;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7872
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7873
  fun sizeChunks cs = List.foldl add 0 cs;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7874
end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7875
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7876
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7877
  fun flattenChunks acc chunks =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7878
      case chunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7879
        [] => acc
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7880
      | chunk :: chunks => flattenChunk acc chunk chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7881
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7882
  and flattenChunk acc chunk chunks =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7883
      case chunk of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7884
        WordChunk w => flattenChunks (renderWord w :: acc) chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7885
      | BreakChunk b => flattenChunks (renderBreak b :: acc) chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7886
      | FrameChunk f => flattenFrame acc f chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7887
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7888
  and flattenFrame acc frame chunks =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7889
      flattenChunks acc (chunksFrame frame @ chunks);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7890
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7891
  fun renderChunks chunks = String.concat (flattenChunks [] chunks);
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
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7894
fun addChunksLine lines indent chunks =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7895
    addLine lines indent (renderChunks chunks);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7896
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7897
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7898
  fun add baseIndent ((extraIndent,chunks),lines) =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7899
      addChunksLine lines (baseIndent + extraIndent) chunks;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7900
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7901
  fun addIndentChunksLines lines baseIndent indent_chunks =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7902
      List.foldl (add baseIndent) lines indent_chunks;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7903
end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7904
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7905
fun isEmptyFrame frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7906
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7907
      val chunks = chunksFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7908
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7909
      val empty = List.null chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7910
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7911
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7912
      val () =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7913
          if not empty orelse sizeFrame frame = 0 then ()
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7914
          else raise Bug "Metis_Print.isEmptyFrame: bad size"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7915
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7916
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7917
      empty
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7918
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7919
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7920
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7921
  fun breakInconsistent blockIndent =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7922
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7923
        fun break chunks =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7924
            case chunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7925
              [] => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7926
            | chunk :: chunks =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7927
              case chunk of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7928
                BreakChunk b =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7929
                let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7930
                  val pre = chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7931
                  and indent = blockIndent + extraIndentBreak b
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7932
                  and post = []
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7933
                in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7934
                  SOME (pre,indent,post)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7935
                end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7936
              | _ =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7937
                case break chunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7938
                  SOME (pre,indent,post) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7939
                  let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7940
                    val post = chunk :: post
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7941
                  in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7942
                    SOME (pre,indent,post)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7943
                  end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7944
                | NONE => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7945
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7946
        break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7947
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7948
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7949
  fun breakConsistent blockIndent =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7950
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7951
        fun break indent_chunks chunks =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7952
            case breakInconsistent blockIndent chunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7953
              NONE => (chunks,indent_chunks)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7954
            | SOME (pre,indent,post) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7955
              break ((indent,post) :: indent_chunks) pre
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7956
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7957
        break []
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7958
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7959
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7960
  fun breakFrame frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7961
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7962
        val Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7963
              {block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7964
               broken = _,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7965
               indent = _,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7966
               size = _,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7967
               chunks} = frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7968
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7969
        val blockIndent = indentBlock block
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7970
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7971
        case breakInconsistent blockIndent chunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7972
          NONE => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7973
        | SOME (pre,indent,post) =>
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
            val broken = true
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7976
            and size = sizeChunks post
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7977
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7978
            val frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7979
                Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7980
                  {block = block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7981
                   broken = broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7982
                   indent = indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7983
                   size = size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7984
                   chunks = post}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7985
          in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7986
            case styleBlock block of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7987
              Inconsistent =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7988
              let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7989
                val indent_chunks = []
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7990
              in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7991
                SOME (pre,indent_chunks,frame)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7992
              end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7993
            | Consistent =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7994
              let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7995
                val (pre,indent_chunks) = breakConsistent blockIndent pre
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7996
              in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7997
                SOME (pre,indent_chunks,frame)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7998
              end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  7999
          end
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
end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8002
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8003
fun removeChunksFrame frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8004
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8005
      val Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8006
            {block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8007
             broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8008
             indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8009
             size = _,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8010
             chunks} = frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8011
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8012
      if broken andalso List.null chunks then NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8013
      else
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8014
        let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8015
          val frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8016
              Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8017
                {block = block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8018
                 broken = true,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8019
                 indent = indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8020
                 size = 0,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8021
                 chunks = []}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8022
        in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8023
          SOME (chunks,frame)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8024
        end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8025
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8026
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8027
val removeChunksFrames =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8028
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8029
      fun remove frames =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8030
          case frames of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8031
            [] =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8032
            let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8033
              val chunks = []
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8034
              and frames = NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8035
              and indent = 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8036
            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8037
              (chunks,frames,indent)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8038
            end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8039
          | top :: rest =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8040
            let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8041
              val (chunks,rest',indent) = remove rest
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8042
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8043
              val indent = indent + indentFrame top
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8044
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8045
              val (chunks,top') =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8046
                  case removeChunksFrame top of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8047
                    NONE => (chunks,NONE)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8048
                  | SOME (topChunks,top) => (topChunks @ chunks, SOME top)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8049
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8050
              val frames' =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8051
                  case (top',rest') of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8052
                    (NONE,NONE) => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8053
                  | (SOME top, NONE) => SOME (top :: rest)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8054
                  | (NONE, SOME rest) => SOME (top :: rest)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8055
                  | (SOME top, SOME rest) => SOME (top :: rest)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8056
            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8057
              (chunks,frames',indent)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8058
            end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8059
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8060
      fn frames =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8061
         let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8062
           val (chunks,frames',indent) = remove frames
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8063
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8064
           val frames = Option.getOpt (frames',frames)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8065
         in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8066
           (chunks,frames,indent)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8067
         end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8068
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8069
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8070
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8071
  fun breakUp lines lineIndent frames =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8072
      case frames of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8073
        [] => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8074
      | frame :: frames =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8075
        case breakUp lines lineIndent frames of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8076
          SOME (lines_indent,lineSize,frames) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8077
          let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8078
            val lineSize = lineSize + sizeFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8079
            and frames = frame :: frames
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
            SOME (lines_indent,lineSize,frames)
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
        | NONE =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8084
          case breakFrame frame of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8085
            NONE => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8086
          | SOME (frameChunks,indent_chunks,frame) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8087
            let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8088
              val (chunks,frames,indent) = removeChunksFrames frames
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8089
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8090
              val chunks = frameChunks @ chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8091
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8092
              val lines = addChunksLine lines lineIndent chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8093
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8094
              val lines = addIndentChunksLines lines indent indent_chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8095
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8096
              val lineIndent = indent + indentFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8097
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8098
              val lineSize = sizeFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8099
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8100
              val frames = frame :: frames
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8101
            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8102
              SOME ((lines,lineIndent),lineSize,frames)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8103
            end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8104
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8105
  fun breakInsideChunk chunk =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8106
      case chunk of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8107
        WordChunk _ => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8108
      | BreakChunk _ => raise Bug "Metis_Print.breakInsideChunk"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8109
      | FrameChunk frame =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8110
        case breakFrame frame of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8111
          SOME (pathChunks,indent_chunks,frame) =>
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 pathIndent = 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8114
            and breakIndent = indentFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8115
          in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8116
            SOME (pathChunks,pathIndent,indent_chunks,breakIndent,frame)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8117
          end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8118
        | NONE => breakInsideFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8119
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8120
  and breakInsideChunks chunks =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8121
      case chunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8122
        [] => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8123
      | chunk :: chunks =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8124
        case breakInsideChunk chunk of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8125
          SOME (pathChunks,pathIndent,indent_chunks,breakIndent,frame) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8126
          let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8127
            val pathChunks = pathChunks @ chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8128
            and chunks = [FrameChunk frame]
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8129
          in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8130
            SOME (pathChunks,pathIndent,indent_chunks,breakIndent,chunks)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8131
          end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8132
        | NONE =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8133
          case breakInsideChunks chunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8134
            SOME (pathChunks,pathIndent,indent_chunks,breakIndent,chunks) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8135
            let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8136
              val chunks = chunk :: chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8137
            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8138
              SOME (pathChunks,pathIndent,indent_chunks,breakIndent,chunks)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8139
            end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8140
          | NONE => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8141
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8142
  and breakInsideFrame frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8143
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8144
        val Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8145
              {block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8146
               broken = _,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8147
               indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8148
               size = _,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8149
               chunks} = frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8150
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8151
        case breakInsideChunks chunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8152
          SOME (pathChunks,pathIndent,indent_chunks,breakIndent,chunks) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8153
          let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8154
            val pathIndent = pathIndent + indent
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8155
            and broken = true
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8156
            and size = sizeChunks chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8157
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8158
            val frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8159
                Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8160
                  {block = block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8161
                   broken = broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8162
                   indent = indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8163
                   size = size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8164
                   chunks = chunks}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8165
          in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8166
            SOME (pathChunks,pathIndent,indent_chunks,breakIndent,frame)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8167
          end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8168
        | NONE => NONE
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 breakInside lines lineIndent frames =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8172
      case frames of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8173
        [] => NONE
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8174
      | frame :: frames =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8175
        case breakInsideFrame frame of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8176
          SOME (pathChunks,pathIndent,indent_chunks,breakIndent,frame) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8177
          let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8178
            val (chunks,frames,indent) = removeChunksFrames frames
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8179
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8180
            val chunks = pathChunks @ chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8181
            and indent = indent + pathIndent
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8182
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8183
            val lines = addChunksLine lines lineIndent chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8184
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8185
            val lines = addIndentChunksLines lines indent indent_chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8186
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8187
            val lineIndent = indent + breakIndent
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8188
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8189
            val lineSize = sizeFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8190
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8191
            val frames = frame :: frames
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8192
          in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8193
            SOME ((lines,lineIndent),lineSize,frames)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8194
          end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8195
        | NONE =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8196
          case breakInside lines lineIndent frames of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8197
            SOME (lines_indent,lineSize,frames) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8198
            let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8199
              val lineSize = lineSize + sizeFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8200
              and frames = frame :: frames
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8201
            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8202
              SOME (lines_indent,lineSize,frames)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8203
            end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8204
          | NONE => NONE;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8205
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8206
  fun breakFrames lines lineIndent frames =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8207
      case breakUp lines lineIndent frames of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8208
        SOME ((lines,lineIndent),lineSize,frames) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8209
        SOME (lines,lineIndent,lineSize,frames)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8210
      | NONE =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8211
        case breakInside lines lineIndent frames of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8212
          SOME ((lines,lineIndent),lineSize,frames) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8213
          SOME (lines,lineIndent,lineSize,frames)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8214
        | NONE => NONE;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8215
end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8216
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8217
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8218
fun checkChunk chunk =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8219
    case chunk of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8220
      WordChunk t => (false, sizeWord t)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8221
    | BreakChunk b => (false, sizeBreak b)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8222
    | FrameChunk b => checkFrame b
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8223
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8224
and checkChunks chunks =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8225
    case chunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8226
      [] => (false,0)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8227
    | chunk :: chunks =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8228
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8229
        val (bk,sz) = checkChunk chunk
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8230
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8231
        val (bk',sz') = checkChunks chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8232
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8233
        (bk orelse bk', sz + sz')
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8234
      end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8235
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8236
and checkFrame frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8237
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8238
      val Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8239
            {block = _,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8240
             broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8241
             indent = _,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8242
             size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8243
             chunks} = frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8244
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8245
      val (bk,sz) = checkChunks chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8246
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8247
      val () =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8248
          if size = sz then ()
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8249
          else raise Bug "Metis_Print.checkFrame: wrong size"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8250
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8251
      val () =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8252
          if broken orelse not bk then ()
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8253
          else raise Bug "Metis_Print.checkFrame: deep broken frame"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8254
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8255
      (broken,size)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8256
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8257
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8258
fun checkFrames frames =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8259
    case frames of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8260
      [] => (true,0)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8261
    | frame :: frames =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8262
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8263
        val (bk,sz) = checkFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8264
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8265
        val (bk',sz') = checkFrames frames
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8266
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8267
        val () =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8268
            if bk' orelse not bk then ()
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8269
            else raise Bug "Metis_Print.checkFrame: broken stack frame"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8270
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8271
        (bk, sz + sz')
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8272
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8273
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8274
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8275
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8276
fun checkState state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8277
    (let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8278
       val State {lineIndent,lineSize,stack} = state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8279
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8280
       val () =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8281
           if not (List.null stack) then ()
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8282
           else raise Error "no stack"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8283
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8284
       val (_,sz) = checkFrames stack
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8285
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8286
       val () =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8287
           if lineSize = sz then ()
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8288
           else raise Error "wrong lineSize"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8289
     in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8290
       ()
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8291
     end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8292
     handle Error err => raise Bug err)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8293
    handle Bug bug => raise Bug ("Metis_Print.checkState: " ^ bug);
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8294
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8295
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8296
fun isEmptyState state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8297
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8298
      val State {lineSize,stack,...} = state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8299
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8300
      lineSize = 0 andalso List.all isEmptyFrame stack
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8301
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8302
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8303
fun isFinalState state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8304
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8305
      val State {stack,...} = state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8306
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8307
      case stack of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8308
        [] => raise Bug "Metis_Print.isFinalState: empty stack"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8309
      | [frame] => isEmptyFrame frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8310
      | _ :: _ :: _ => false
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8311
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8312
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8313
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8314
  val initialBlock =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8315
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8316
        val indent = 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8317
        and style = Inconsistent
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8318
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8319
        Block
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8320
          {indent = indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8321
           style = style}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8322
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8323
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8324
  val initialFrame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8325
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8326
        val block = initialBlock
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8327
        and broken = false
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8328
        and indent = 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8329
        and size = 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8330
        and chunks = []
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8331
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8332
        Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8333
          {block = block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8334
           broken = broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8335
           indent = indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8336
           size = size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8337
           chunks = chunks}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8338
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8339
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8340
  val initialState =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8341
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8342
        val lineIndent = 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8343
        and lineSize = 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8344
        and stack = [initialFrame]
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8345
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8346
        State
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8347
          {lineIndent = lineIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8348
           lineSize = lineSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8349
           stack = stack}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8350
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8351
end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8352
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8353
fun normalizeState lineLength lines state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8354
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8355
      val State {lineIndent,lineSize,stack} = state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8356
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8357
      val within =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8358
          case lineLength of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8359
            NONE => true
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8360
          | SOME len => lineIndent + lineSize <= len
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8361
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8362
      if within then (lines,state)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8363
      else
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8364
        case breakFrames lines lineIndent stack of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8365
          NONE => (lines,state)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8366
        | SOME (lines,lineIndent,lineSize,stack) =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8367
          let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8368
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8369
            val () = checkState state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8370
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8371
            val state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8372
                State
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8373
                  {lineIndent = lineIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8374
                   lineSize = lineSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8375
                   stack = stack}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8376
          in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8377
            normalizeState lineLength lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8378
          end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8379
    end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8380
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8381
    handle Bug bug => raise Bug ("Metis_Print.normalizeState:\n" ^ bug)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8382
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8383
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8384
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8385
  fun executeBeginBlock block lines state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8386
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8387
        val State {lineIndent,lineSize,stack} = state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8388
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8389
        val broken = false
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8390
        and indent = indentBlock block
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8391
        and size = 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8392
        and chunks = []
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8393
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8394
        val frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8395
            Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8396
              {block = block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8397
               broken = broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8398
               indent = indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8399
               size = size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8400
               chunks = chunks}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8401
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8402
        val stack = frame :: stack
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8403
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8404
        val state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8405
            State
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8406
              {lineIndent = lineIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8407
               lineSize = lineSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8408
               stack = stack}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8409
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8410
        (lines,state)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8411
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8412
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8413
  fun executeEndBlock lines state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8414
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8415
        val State {lineIndent,lineSize,stack} = state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8416
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8417
        val (lineSize,stack) =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8418
            case stack of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8419
              [] => raise Bug "Metis_Print.executeEndBlock: empty stack"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8420
            | topFrame :: stack =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8421
              let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8422
                val Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8423
                      {block = topBlock,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8424
                       broken = topBroken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8425
                       indent = topIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8426
                       size = topSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8427
                       chunks = topChunks} = topFrame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8428
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8429
                val (lineSize,topSize,topChunks,topFrame) =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8430
                    case topChunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8431
                      BreakChunk break :: chunks =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8432
                      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8433
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8434
                        val () =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8435
                            let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8436
                              val mesg =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8437
                                  "ignoring a break at the end of a " ^
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8438
                                  "pretty-printing block"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8439
                            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8440
                              warn mesg
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8441
                            end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8442
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8443
                        val n = sizeBreak break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8444
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8445
                        val lineSize = lineSize - n
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8446
                        and topSize = topSize - n
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8447
                        and topChunks = chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8448
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8449
                        val topFrame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8450
                            Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8451
                              {block = topBlock,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8452
                               broken = topBroken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8453
                               indent = topIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8454
                               size = topSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8455
                               chunks = topChunks}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8456
                      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8457
                        (lineSize,topSize,topChunks,topFrame)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8458
                      end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8459
                    | _ => (lineSize,topSize,topChunks,topFrame)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8460
              in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8461
                if List.null topChunks then (lineSize,stack)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8462
                else
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8463
                  case stack of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8464
                    [] => raise Error "Metis_Print.execute: too many end blocks"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8465
                  | frame :: stack =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8466
                    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8467
                      val Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8468
                            {block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8469
                             broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8470
                             indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8471
                             size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8472
                             chunks} = frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8473
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8474
                      val size = size + topSize
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8475
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8476
                      val chunk = FrameChunk topFrame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8477
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8478
                      val chunks = chunk :: chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8479
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8480
                      val frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8481
                          Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8482
                            {block = block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8483
                             broken = broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8484
                             indent = indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8485
                             size = size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8486
                             chunks = chunks}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8487
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8488
                      val stack = frame :: stack
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8489
                    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8490
                      (lineSize,stack)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8491
                    end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8492
              end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8493
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8494
        val state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8495
            State
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8496
              {lineIndent = lineIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8497
               lineSize = lineSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8498
               stack = stack}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8499
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8500
        (lines,state)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8501
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8502
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8503
  fun executeAddWord lineLength word lines state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8504
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8505
        val State {lineIndent,lineSize,stack} = state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8506
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8507
        val n = sizeWord word
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8508
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8509
        val lineSize = lineSize + n
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8510
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8511
        val stack =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8512
            case stack of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8513
              [] => raise Bug "Metis_Print.executeAddWord: empty stack"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8514
            | frame :: stack =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8515
              let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8516
                val Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8517
                      {block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8518
                       broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8519
                       indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8520
                       size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8521
                       chunks} = frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8522
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8523
                val size = size + n
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8524
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8525
                val chunk = WordChunk word
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8526
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8527
                val chunks = chunk :: chunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8528
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8529
                val frame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8530
                    Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8531
                      {block = block,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8532
                       broken = broken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8533
                       indent = indent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8534
                       size = size,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8535
                       chunks = chunks}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8536
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8537
                val stack = frame :: stack
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8538
              in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8539
                stack
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8540
              end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8541
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8542
        val state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8543
            State
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8544
              {lineIndent = lineIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8545
               lineSize = lineSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8546
               stack = stack}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8547
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8548
        normalizeState lineLength lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8549
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8550
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8551
  fun executeAddBreak lineLength break lines state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8552
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8553
        val State {lineIndent,lineSize,stack} = state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8554
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8555
        val (topFrame,restFrames) =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8556
            case stack of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8557
              [] => raise Bug "Metis_Print.executeAddBreak: empty stack"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8558
            | topFrame :: restFrames => (topFrame,restFrames)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8559
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8560
        val Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8561
              {block = topBlock,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8562
               broken = topBroken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8563
               indent = topIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8564
               size = topSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8565
               chunks = topChunks} = topFrame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8566
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8567
        case topChunks of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8568
          [] => (lines,state)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8569
        | topChunk :: restTopChunks =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8570
          let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8571
            val (topChunks,n) =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8572
                case topChunk of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8573
                  BreakChunk break' =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8574
                  let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8575
                    val break = appendBreak break' break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8576
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8577
                    val chunk = BreakChunk break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8578
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8579
                    val topChunks = chunk :: restTopChunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8580
                    and n = sizeBreak break - sizeBreak break'
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8581
                  in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8582
                    (topChunks,n)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8583
                  end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8584
                | _ =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8585
                  let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8586
                    val chunk = BreakChunk break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8587
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8588
                    val topChunks = chunk :: topChunks
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8589
                    and n = sizeBreak break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8590
                  in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8591
                    (topChunks,n)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8592
                  end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8593
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8594
            val lineSize = lineSize + n
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8595
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8596
            val topSize = topSize + n
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8597
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8598
            val topFrame =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8599
                Frame
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8600
                  {block = topBlock,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8601
                   broken = topBroken,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8602
                   indent = topIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8603
                   size = topSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8604
                   chunks = topChunks}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8605
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8606
            val stack = topFrame :: restFrames
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8607
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8608
            val state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8609
                State
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8610
                  {lineIndent = lineIndent,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8611
                   lineSize = lineSize,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8612
                   stack = stack}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8613
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8614
            val lineLength =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8615
                if breakingFrame topFrame then SOME ~1 else lineLength
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8616
          in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8617
            normalizeState lineLength lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8618
          end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8619
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8620
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8621
  fun executeBigBreak lines state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8622
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8623
        val lineLength = SOME ~1
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8624
        and break = mkBreak 0
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8625
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8626
        executeAddBreak lineLength break lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8627
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8628
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8629
  fun executeAddNewline lineLength lines state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8630
      if isEmptyState state then (addEmptyLine lines, state)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8631
      else executeBigBreak lines state;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8632
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8633
  fun executeEof lineLength lines state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8634
      if isFinalState state then (lines,state)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8635
      else
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8636
        let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8637
          val (lines,state) = executeBigBreak lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8638
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8639
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8640
          val () =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8641
              if isFinalState state then ()
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8642
              else raise Bug "Metis_Print.executeEof: not a final state"
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8643
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8644
        in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8645
          (lines,state)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8646
        end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8647
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8648
  fun render {lineLength} =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8649
      let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8650
        fun execute step state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8651
            let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8652
              val lines = []
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8653
            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8654
              case step of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8655
                BeginBlock block => executeBeginBlock block lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8656
              | EndBlock => executeEndBlock lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8657
              | AddWord word => executeAddWord lineLength word lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8658
              | AddBreak break => executeAddBreak lineLength break lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8659
              | AddNewline => executeAddNewline lineLength lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8660
            end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8661
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8662
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8663
        val execute = fn step => fn state =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8664
            let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8665
              val (lines,state) = execute step state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8666
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8667
              val () = checkState state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8668
            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8669
              (lines,state)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8670
            end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8671
            handle Bug bug =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8672
              raise Bug ("Metis_Print.execute: after " ^ toStringStep step ^
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8673
                         " command:\n" ^ bug)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8674
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8675
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8676
        fun final state =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8677
            let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8678
              val lines = []
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8679
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8680
              val (lines,state) = executeEof lineLength lines state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8681
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8682
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8683
              val () = checkState state
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8684
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8685
            in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8686
              if List.null lines then Metis_Stream.Nil else Metis_Stream.singleton lines
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8687
            end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8688
(*BasicDebug
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8689
            handle Bug bug => raise Bug ("Metis_Print.final: " ^ bug)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8690
*)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8691
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8692
        fn pps =>
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8693
           let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8694
             val lines = Metis_Stream.maps execute final initialState pps
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8695
           in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8696
             revConcat lines
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8697
           end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8698
      end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8699
end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8700
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8701
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8702
  fun inc {indent,line} acc = line :: nSpaces indent :: acc;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8703
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8704
  fun incn (indent_line,acc) = inc indent_line ("\n" :: acc);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8705
in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8706
  fun toStringWithLineLength len ppA a =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8707
      case render len (ppA a) of
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8708
        Metis_Stream.Nil => ""
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8709
      | Metis_Stream.Cons (h,t) =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8710
        let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8711
          val lines = Metis_Stream.foldl incn (inc h []) (t ())
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8712
        in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8713
          String.concat (List.rev lines)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8714
        end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8715
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8716
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8717
local
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8718
  fun renderLine {indent,line} = nSpaces indent ^ line ^ "\n";
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8719
in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8720
  fun toStreamWithLineLength len ppA a =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8721
      Metis_Stream.map renderLine (render len (ppA a));
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8722
end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8723
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8724
fun toLine ppA a = toStringWithLineLength {lineLength = NONE} ppA a;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8725
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8726
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8727
(* Pretty-printer rendering with a global line length.                       *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8728
(* ------------------------------------------------------------------------- *)
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8729
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8730
val lineLength = Unsynchronized.ref initialLineLength;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8731
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8732
fun toString ppA a =
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8733
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8734
      val len = {lineLength = SOME (!lineLength)}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8735
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8736
      toStringWithLineLength len ppA a
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8737
    end;
43269
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  8738
3535f16d9714 new Metis version
blanchet
parents: 43268
diff changeset
  8739
fun toStream ppA a =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8740
    let
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8741
      val len = {lineLength = SOME (!lineLength)}
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8742
    in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8743
      toStreamWithLineLength len ppA a
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8744
    end;
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8745
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  8746
fun trace ppX nameX =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  8747
    let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  8748
      fun ppNameX x =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  8749
          consistentBlock 2
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  8750
            [ppString nameX,
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  8751
             ppString " =",
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  8752
             break,
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  8753
             ppX x]
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  8754
    in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  8755
      fn x => Metis_Useful.trace (toString ppNameX x ^ "\n")
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  8756
    end;
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8757
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8758
end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8759
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8760
(**** Original file: src/Parse.sig ****)
39351
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
(* PARSING                                                                   *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  8764
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
39351
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8767
signature Metis_Parse =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8768
sig
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8769
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8770
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8771
(* A "cannot parse" exception.                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8772
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8773
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8774
exception NoParse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8775
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8776
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8777
(* Recursive descent parsing combinators.                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8778
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8779
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8780
(*
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8781
  Recommended fixities:
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8782
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8783
  infixr 9 >>++
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8784
  infixr 8 ++
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8785
  infixr 7 >>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8786
  infixr 6 ||
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8787
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8788
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8789
val error : 'a -> 'b * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8790
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8791
val ++ : ('a -> 'b * 'a) * ('a -> 'c * 'a) -> 'a -> ('b * 'c) * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8792
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8793
val >> : ('a -> 'b * 'a) * ('b -> 'c) -> 'a -> 'c * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8794
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8795
val >>++ : ('a -> 'b * 'a) * ('b -> 'a -> 'c * 'a) -> 'a -> 'c * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8796
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8797
val || : ('a -> 'b * 'a) * ('a -> 'b * 'a) -> 'a -> 'b * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8798
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8799
val first : ('a -> 'b * 'a) list -> 'a -> 'b * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8800
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8801
val mmany : ('s -> 'a -> 's * 'a) -> 's -> 'a -> 's * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8802
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8803
val many : ('a -> 'b * 'a) -> 'a -> 'b list * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8804
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8805
val atLeastOne : ('a -> 'b * 'a) -> 'a -> 'b list * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8806
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8807
val nothing : 'a -> unit * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8808
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8809
val optional : ('a -> 'b * 'a) -> 'a -> 'b option * 'a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8810
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8811
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8812
(* Metis_Stream-based parsers.                                                     *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8813
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8814
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8815
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
  8816
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8817
val maybe : ('a -> 'b option) -> ('a,'b) parser
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8818
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8819
val finished : ('a,unit) parser
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8820
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8821
val some : ('a -> bool) -> ('a,'a) parser
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8822
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8823
val any : ('a,'a) parser
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8824
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8825
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8826
(* Parsing whole streams.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8827
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8828
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8829
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
  8830
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8831
val fromList : ('a,'b) parser -> 'a list -> 'b
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8832
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8833
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
  8834
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8835
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8836
(* Parsing lines of text.                                                    *)
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
val initialize :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8840
    {lines : string Metis_Stream.stream} ->
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8841
    {chars : char list Metis_Stream.stream,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8842
     parseErrorLocation : unit -> string}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8843
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8844
val exactChar : char -> (char,unit) parser
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
val exactCharList : char list -> (char,unit) parser
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8847
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8848
val exactString : string -> (char,unit) parser
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8849
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8850
val escapeString : {escape : char list} -> (char,string) parser
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8851
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8852
val manySpace : (char,unit) parser
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 atLeastOneSpace : (char,unit) parser
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
val fromString : (char,'a) parser -> string -> 'a
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8857
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
(* Infix operators.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8860
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8861
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8862
val parseInfixes :
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8863
    Metis_Print.infixes ->
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8864
    (Metis_Print.token * 'a * 'a -> 'a) -> ('b,Metis_Print.token) parser ->
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8865
    ('b,'a) parser -> ('b,'a) parser
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8866
39351
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
(* Quotations.                                                               *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8869
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8870
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8871
type 'a quotation = 'a frag list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8872
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8873
val parseQuotation : ('a -> string) -> (string -> 'b) -> 'a quotation -> 'b
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8874
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8875
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8876
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  8877
(**** Original file: src/Parse.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8878
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8879
(* ========================================================================= *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8880
(* PARSING                                                                   *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  8881
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8882
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8883
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8884
structure Metis_Parse :> Metis_Parse =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8885
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8886
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8887
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8888
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8889
infixr 9 >>++
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8890
infixr 8 ++
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8891
infixr 7 >>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8892
infixr 6 ||
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8893
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8894
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8895
(* A "cannot parse" exception.                                               *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8896
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8897
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8898
exception NoParse;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8899
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8900
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8901
(* Recursive descent parsing combinators.                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8902
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8903
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8904
val error : 'a -> 'b * 'a = fn _ => raise NoParse;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8905
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8906
fun op ++ (parser1,parser2) input =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8907
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8908
      val (result1,input) = parser1 input
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8909
      val (result2,input) = parser2 input
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8910
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8911
      ((result1,result2),input)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8912
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8913
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8914
fun op >> (parser : 'a -> 'b * 'a, treatment) input =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8915
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8916
      val (result,input) = parser input
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8917
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8918
      (treatment result, input)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8919
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8920
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8921
fun op >>++ (parser,treatment) input =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8922
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8923
      val (result,input) = parser input
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8924
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8925
      treatment result input
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8926
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8927
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8928
fun op || (parser1,parser2) input =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8929
    parser1 input handle NoParse => parser2 input;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8930
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8931
fun first [] _ = raise NoParse
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8932
  | first (parser :: parsers) input = (parser || first parsers) input;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8933
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8934
fun mmany parser state input =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8935
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8936
      val (state,input) = parser state input
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8937
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8938
      mmany parser state input
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8939
    end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8940
    handle NoParse => (state,input);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8941
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8942
fun many parser =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8943
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8944
      fun sparser l = parser >> (fn x => x :: l)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8945
    in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  8946
      mmany sparser [] >> List.rev
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8947
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8948
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8949
fun atLeastOne p = (p ++ many p) >> op::;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8950
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8951
fun nothing input = ((),input);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8952
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8953
fun optional p = (p >> SOME) || (nothing >> K NONE);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8954
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8955
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8956
(* Metis_Stream-based parsers.                                                     *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8957
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8958
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8959
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
  8960
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8961
fun maybe p Metis_Stream.Nil = raise NoParse
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8962
  | maybe p (Metis_Stream.Cons (h,t)) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8963
    case p h of SOME r => (r, t ()) | NONE => raise NoParse;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8964
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8965
fun finished Metis_Stream.Nil = ((), Metis_Stream.Nil)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8966
  | finished (Metis_Stream.Cons _) = raise NoParse;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8967
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8968
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
  8969
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8970
fun any input = some (K true) input;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  8971
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8972
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8973
(* Parsing whole streams.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8974
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8975
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8976
fun fromStream parser input =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8977
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8978
      val (res,_) = (parser ++ finished >> fst) input
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8979
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8980
      res
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8981
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8982
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8983
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
  8984
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8985
fun everything parser =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8986
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8987
      fun parserOption input =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8988
          SOME (parser input)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8989
          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
  8990
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8991
      fun parserList input =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8992
          case parserOption input of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8993
            NONE => Metis_Stream.Nil
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8994
          | SOME (result,input) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  8995
            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
  8996
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8997
      parserList
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8998
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  8999
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9000
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9001
(* Parsing lines of text.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9002
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9003
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9004
fun initialize {lines} =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9005
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9006
      val lastLine = Unsynchronized.ref (~1,"","","")
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9007
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9008
      val chars =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9009
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9010
            fun saveLast line =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9011
                let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9012
                  val Unsynchronized.ref (n,_,l2,l3) = lastLine
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9013
                  val () = lastLine := (n + 1, l2, l3, line)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9014
                in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9015
                  String.explode line
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9016
                end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9017
          in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9018
            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
  9019
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9020
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9021
      fun parseErrorLocation () =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9022
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9023
            val Unsynchronized.ref (n,l1,l2,l3) = lastLine
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9024
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9025
            (if n <= 0 then "at start"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9026
             else "around line " ^ Int.toString n) ^
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9027
            chomp (":\n" ^ l1 ^ l2 ^ l3)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9028
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9029
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9030
      {chars = chars,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9031
       parseErrorLocation = parseErrorLocation}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9032
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9033
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9034
fun exactChar (c : char) = some (equal c) >> K ();
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9035
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9036
fun exactCharList cs =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9037
    case cs of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9038
      [] => nothing
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9039
    | c :: cs => (exactChar c ++ exactCharList cs) >> snd;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9040
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9041
fun exactString s = exactCharList (String.explode s);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9042
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9043
fun escapeString {escape} =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9044
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9045
      fun isEscape c = mem c escape
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9046
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9047
      fun isNormal c =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9048
          case c of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9049
            #"\\" => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9050
          | #"\n" => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9051
          | #"\t" => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9052
          | _ => not (isEscape c)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9053
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9054
      val escapeParser =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9055
          (exactChar #"\\" >> K #"\\") ||
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9056
          (exactChar #"n" >> K #"\n") ||
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9057
          (exactChar #"t" >> K #"\t") ||
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9058
          some isEscape
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9059
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9060
      val charParser =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9061
          ((exactChar #"\\" ++ escapeParser) >> snd) ||
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9062
          some isNormal
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9063
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9064
      many charParser >> String.implode
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9065
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9066
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9067
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9068
  val isSpace = Char.isSpace;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9069
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9070
  val space = some isSpace;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9071
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9072
  val manySpace = many space >> K ();
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9073
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9074
  val atLeastOneSpace = atLeastOne space >> K ();
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9075
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9076
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9077
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
  9078
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9079
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9080
(* Infix operators.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9081
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9082
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9083
fun parseLayeredInfixes {tokens,assoc} mk tokParser subParser =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9084
    let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9085
      fun layerTokParser inp =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9086
          let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9087
            val tok_rest as (tok,_) = tokParser inp
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9088
          in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9089
            if Metis_StringSet.member tok tokens then tok_rest
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9090
            else raise NoParse
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9091
          end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9092
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9093
      fun layerMk (x,txs) =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9094
          case assoc of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9095
            Metis_Print.LeftAssoc =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9096
            let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9097
              fun inc ((t,y),z) = mk (t,z,y)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9098
            in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9099
              List.foldl inc x txs
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9100
            end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9101
          | Metis_Print.NonAssoc =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9102
            (case txs of
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9103
               [] => x
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9104
             | [(t,y)] => mk (t,x,y)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9105
             | _ => raise NoParse)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9106
          | Metis_Print.RightAssoc =>
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  9107
            (case List.rev txs of
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9108
               [] => x
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9109
             | tx :: txs =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9110
               let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9111
                 fun inc ((t,y),(u,z)) = (t, mk (u,y,z))
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9112
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9113
                 val (t,y) = List.foldl inc tx txs
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9114
               in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9115
                 mk (t,x,y)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9116
               end)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9117
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9118
      val layerParser = subParser ++ many (layerTokParser ++ subParser)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9119
    in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9120
      layerParser >> layerMk
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9121
    end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9122
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9123
fun parseInfixes ops =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9124
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9125
      val layeredOps = Metis_Print.layerInfixes ops
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 iparsers = List.map parseLayeredInfixes layeredOps
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9128
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9129
      fn mk => fn tokParser => fn subParser =>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9130
         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
  9131
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9132
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9133
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9134
(* Quotations.                                                               *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9135
(* ------------------------------------------------------------------------- *)
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
type 'a quotation = 'a frag list;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9138
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9139
fun parseQuotation printer parser quote =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9140
  let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9141
    fun expand (QUOTE q, s) = s ^ q
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9142
      | expand (ANTIQUOTE a, s) = s ^ printer a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9143
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9144
    val string = List.foldl expand "" quote
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9145
  in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9146
    parser string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9147
  end;
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
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9150
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9151
(**** Original file: src/Name.sig ****)
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
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9154
(* NAMES                                                                     *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  9155
(* Copyright (c) 2004 Joe Leslie-Hurd, distributed under the BSD License     *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9158
signature Metis_Name =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9159
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9160
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9161
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9162
(* A type of names.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9163
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9164
43268
c0eaa8b9bff5 removed yet another hack in "make_metis" script -- respect opacity of "Metis_Name.name"
blanchet
parents: 42102
diff changeset
  9165
type name
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9166
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9167
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9168
(* A total ordering.                                                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9169
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9170
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9171
val compare : name * name -> order
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9172
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9173
val equal : name -> name -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9174
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9175
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9176
(* Fresh names.                                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9177
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9178
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9179
val newName : unit -> name
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9180
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9181
val newNames : int -> name list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9182
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9183
val variantPrime : {avoid : name -> bool} -> name -> name
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9184
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9185
val variantNum : {avoid : name -> bool} -> name -> name
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9186
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9187
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9188
(* Parsing and pretty printing.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9189
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9190
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9191
val pp : name Metis_Print.pp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9192
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9193
val toString : name -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9194
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9195
val fromString : string -> name
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9196
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9197
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9198
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9199
(**** Original file: src/Name.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9200
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
(* NAMES                                                                     *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  9203
(* Copyright (c) 2004 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9206
structure Metis_Name :> Metis_Name =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9207
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9208
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9209
open Metis_Useful;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9210
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9211
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9212
(* A type of names.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9213
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9214
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9215
type name = string;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9216
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9217
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9218
(* A total ordering.                                                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9219
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9220
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9221
val compare = String.compare;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9222
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9223
fun equal n1 n2 = n1 = n2;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9224
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9225
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9226
(* Fresh variables.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9227
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9228
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9229
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9230
  val prefix  = "_";
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9231
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9232
  fun numName i = mkPrefix prefix (Int.toString i);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9233
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9234
  fun newName () = numName (newInt ());
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9235
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9236
  fun newNames n = List.map numName (newInts n);
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9237
end;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9238
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9239
fun variantPrime {avoid} =
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9240
    let
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9241
      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
  9242
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9243
      variant
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9244
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9245
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9246
local
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9247
  fun isDigitOrPrime c = c = #"'" orelse Char.isDigit c;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9248
in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9249
  fun variantNum {avoid} n =
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9250
      if not (avoid n) then n
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9251
      else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9252
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9253
          val n = stripSuffix isDigitOrPrime n
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9254
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9255
          fun variant i =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9256
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9257
                val n_i = n ^ Int.toString i
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9258
              in
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9259
                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
  9260
              end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9261
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9262
          variant 0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9263
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9264
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9265
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9266
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9267
(* Parsing and pretty printing.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9268
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9269
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9270
val pp = Metis_Print.ppString;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9271
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9272
fun toString s : string = s;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9273
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9274
fun fromString s : name = s;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9275
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9276
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9277
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9278
structure Metis_NameOrdered =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9279
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
  9280
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9281
structure Metis_NameMap = Metis_KeyMap (Metis_NameOrdered);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9282
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9283
structure Metis_NameSet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9284
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9285
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9286
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9287
  structure S = Metis_ElementSet (Metis_NameMap);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9288
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9289
  open S;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9290
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9291
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9292
val pp =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9293
    Metis_Print.ppMap
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9294
      toList
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9295
      (Metis_Print.ppBracket "{" "}" (Metis_Print.ppOpList "," Metis_Name.pp));
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9296
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9297
end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9298
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9299
(**** Original file: src/NameArity.sig ****)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9300
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9301
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9302
(* NAME/ARITY PAIRS                                                          *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  9303
(* Copyright (c) 2004 Joe Leslie-Hurd, distributed under the BSD License     *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9304
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9305
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9306
signature Metis_NameArity =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9307
sig
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9308
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9309
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9310
(* A type of name/arity pairs.                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9311
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9312
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9313
type nameArity = Metis_Name.name * int
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9314
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9315
val name : nameArity -> Metis_Name.name
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9316
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9317
val arity : nameArity -> int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9318
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9319
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9320
(* Testing for different arities.                                            *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9321
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9322
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9323
val nary : int -> nameArity -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9324
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9325
val nullary : nameArity -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9326
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9327
val unary : nameArity -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9328
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9329
val binary : nameArity -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9330
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9331
val ternary : nameArity -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9332
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9333
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9334
(* A total ordering.                                                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9335
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9336
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9337
val compare : nameArity * nameArity -> order
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9338
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9339
val equal : nameArity -> nameArity -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9340
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9341
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9342
(* Parsing and pretty printing.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9343
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9344
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9345
val pp : nameArity Metis_Print.pp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9346
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9347
end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9348
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9349
(**** Original file: src/NameArity.sml ****)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9350
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9351
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9352
(* NAME/ARITY PAIRS                                                          *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  9353
(* Copyright (c) 2004 Joe Leslie-Hurd, distributed under the BSD License     *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9354
(* ========================================================================= *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9355
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9356
structure Metis_NameArity :> Metis_NameArity =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9357
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9358
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9359
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9360
(* A type of name/arity pairs.                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9361
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9362
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9363
type nameArity = Metis_Name.name * int;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9364
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9365
fun name ((n,_) : nameArity) = n;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9366
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9367
fun arity ((_,i) : nameArity) = i;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9368
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9369
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9370
(* Testing for different arities.                                            *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9371
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9372
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9373
fun nary i n_i = arity n_i = i;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9374
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9375
val nullary = nary 0
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9376
and unary = nary 1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9377
and binary = nary 2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9378
and ternary = nary 3;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9379
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9380
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9381
(* A total ordering.                                                         *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9382
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9383
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9384
fun compare ((n1,i1),(n2,i2)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9385
    case Metis_Name.compare (n1,n2) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9386
      LESS => LESS
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9387
    | EQUAL => Int.compare (i1,i2)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9388
    | GREATER => GREATER;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9389
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9390
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
  9391
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9392
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9393
(* Parsing and pretty printing.                                              *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9394
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9395
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9396
fun pp (n,i) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  9397
    Metis_Print.inconsistentBlock 0
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9398
      [Metis_Name.pp n,
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9399
       Metis_Print.ppString "/",
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9400
       Metis_Print.ppInt i];
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9401
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9402
end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9403
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9404
structure Metis_NameArityOrdered =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9405
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
  9406
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9407
structure Metis_NameArityMap =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9408
struct
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9409
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9410
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9411
  structure S = Metis_KeyMap (Metis_NameArityOrdered);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9412
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9413
  open S;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9414
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9415
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9416
fun compose m1 m2 =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9417
    let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9418
      fun pk ((_,a),n) = peek m2 (n,a)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9419
    in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9420
      mapPartial pk m1
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9421
    end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9422
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9423
end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9424
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9425
structure Metis_NameAritySet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9426
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9427
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9428
local
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9429
  structure S = Metis_ElementSet (Metis_NameArityMap);
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9430
in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9431
  open S;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9432
end;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9433
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9434
val allNullary = all Metis_NameArity.nullary;
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9435
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9436
val pp =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9437
    Metis_Print.ppMap
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9438
      toList
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9439
      (Metis_Print.ppBracket "{" "}" (Metis_Print.ppOpList "," Metis_NameArity.pp));
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9440
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9441
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9442
end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9443
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9444
(**** Original file: src/Term.sig ****)
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
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9447
(* FIRST ORDER LOGIC TERMS                                                   *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  9448
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9449
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9450
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9451
signature Metis_Term =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9452
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9453
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9454
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9455
(* A type of first order logic terms.                                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9456
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9457
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9458
type var = Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9459
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9460
type functionName = Metis_Name.name
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9461
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9462
type function = functionName * int
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
type const = functionName
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9465
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9466
datatype term =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9467
    Var of var
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9468
  | Fn of functionName * term list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9469
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9470
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9471
(* Constructors and destructors.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9472
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9473
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9474
(* Variables *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9475
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9476
val destVar : term -> var
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9477
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9478
val isVar : term -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9479
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9480
val equalVar : var -> term -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9481
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9482
(* Functions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9483
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9484
val destFn : term -> functionName * term list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9485
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9486
val isFn : term -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9487
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9488
val fnName : term -> functionName
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9489
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9490
val fnArguments : term -> term list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9491
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9492
val fnArity : term -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9493
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9494
val fnFunction : term -> function
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9495
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9496
val functions : term -> Metis_NameAritySet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9497
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9498
val functionNames : term -> Metis_NameSet.set
23442
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
(* Constants *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9501
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9502
val mkConst : const -> term
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9503
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9504
val destConst : term -> const
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9505
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9506
val isConst : term -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9507
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9508
(* Binary functions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9509
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9510
val mkBinop : functionName -> term * term -> term
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9511
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9512
val destBinop : functionName -> term -> term * term
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9513
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9514
val isBinop : functionName -> term -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9515
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9516
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9517
(* The size of a term in symbols.                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9518
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9519
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9520
val symbols : term -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9521
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9522
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9523
(* A total comparison function for terms.                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9524
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9525
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9526
val compare : term * term -> order
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9527
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9528
val equal : term -> term -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9529
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9530
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9531
(* Subterms.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9532
(* ------------------------------------------------------------------------- *)
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
type path = int list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9535
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9536
val subterm : term -> path -> term
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
val subterms : term -> (path * term) list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9539
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9540
val replace : term -> path * term -> term
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9541
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9542
val find : (term -> bool) -> term -> path option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9543
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9544
val ppPath : path Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9545
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9546
val pathToString : path -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9547
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9548
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9549
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9550
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9551
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9552
val freeIn : var -> term -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9553
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9554
val freeVars : term -> Metis_NameSet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9555
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9556
val freeVarsList : term list -> Metis_NameSet.set
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9557
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9558
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9559
(* Fresh variables.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9560
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9561
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9562
val newVar : unit -> term
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9563
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9564
val newVars : int -> term list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9565
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9566
val variantPrime : Metis_NameSet.set -> var -> var
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9567
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9568
val variantNum : Metis_NameSet.set -> var -> var
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9569
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9570
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9571
(* Special support for terms with type annotations.                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9572
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9573
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9574
val hasTypeFunctionName : functionName
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9575
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9576
val hasTypeFunction : function
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9577
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9578
val isTypedVar : term -> bool
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
val typedSymbols : term -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9581
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9582
val nonVarTypedSubterms : term -> (path * term) list
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9585
(* Special support for terms with an explicit function application operator. *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9586
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9587
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9588
val appName : Metis_Name.name
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9589
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9590
val mkApp : term * term -> term
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9591
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9592
val destApp : term -> term * term
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9593
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9594
val isApp : term -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9595
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9596
val listMkApp : term * term list -> term
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9597
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9598
val stripApp : term -> term * term list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9599
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9600
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9601
(* Parsing and pretty printing.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9602
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9603
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9604
(* Infix symbols *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9605
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9606
val infixes : Metis_Print.infixes Unsynchronized.ref
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9607
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9608
(* The negation symbol *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9609
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9610
val negation : string Unsynchronized.ref
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9611
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9612
(* Binder symbols *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9613
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9614
val binders : string list Unsynchronized.ref
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9615
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9616
(* Bracket symbols *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9617
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9618
val brackets : (string * string) list Unsynchronized.ref
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9619
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9620
(* Pretty printing *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9621
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9622
val pp : term Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9623
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9624
val toString : term -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9625
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9626
(* Parsing *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9627
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9628
val fromString : string -> term
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9629
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9630
val parse : term Metis_Parse.quotation -> term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9631
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9632
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9633
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9634
(**** Original file: src/Term.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9635
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9636
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9637
(* FIRST ORDER LOGIC TERMS                                                   *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
  9638
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9639
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9640
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9641
structure Metis_Term :> Metis_Term =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9642
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9643
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9644
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9645
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9646
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9647
(* A type of first order logic terms.                                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9648
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9649
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9650
type var = Metis_Name.name;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9651
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9652
type functionName = Metis_Name.name;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9653
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9654
type function = functionName * int;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9655
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9656
type const = functionName;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9657
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9658
datatype term =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9659
    Var of Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9660
  | Fn of Metis_Name.name * term list;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9661
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9662
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9663
(* Constructors and destructors.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9664
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9665
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9666
(* Variables *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9667
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9668
fun destVar (Var v) = v
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9669
  | destVar (Fn _) = raise Error "destVar";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9670
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9671
val isVar = can destVar;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9672
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9673
fun equalVar v (Var v') = Metis_Name.equal v v'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9674
  | equalVar _ _ = false;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9675
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9676
(* Functions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9677
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9678
fun destFn (Fn f) = f
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9679
  | destFn (Var _) = raise Error "destFn";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9680
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9681
val isFn = can destFn;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9682
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9683
fun fnName tm = fst (destFn tm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9684
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9685
fun fnArguments tm = snd (destFn tm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9686
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9687
fun fnArity tm = length (fnArguments tm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9688
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9689
fun fnFunction tm = (fnName tm, fnArity tm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9690
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9691
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9692
  fun func fs [] = fs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9693
    | func fs (Var _ :: tms) = func fs tms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9694
    | func fs (Fn (n,l) :: tms) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9695
      func (Metis_NameAritySet.add fs (n, length l)) (l @ tms);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9696
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9697
  fun functions tm = func Metis_NameAritySet.empty [tm];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9698
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9699
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9700
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9701
  fun func fs [] = fs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9702
    | func fs (Var _ :: tms) = func fs tms
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9703
    | 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
  9704
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9705
  fun functionNames tm = func Metis_NameSet.empty [tm];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9706
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9707
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9708
(* Constants *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9709
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9710
fun mkConst c = (Fn (c, []));
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9711
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9712
fun destConst (Fn (c, [])) = c
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9713
  | destConst _ = raise Error "destConst";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9714
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9715
val isConst = can destConst;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9716
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9717
(* Binary functions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9718
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9719
fun mkBinop f (a,b) = Fn (f,[a,b]);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9720
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9721
fun destBinop f (Fn (x,[a,b])) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9722
    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
  9723
  | destBinop _ _ = raise Error "Metis_Term.destBinop: not a binop";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9724
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9725
fun isBinop f = can (destBinop f);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9726
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9727
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9728
(* The size of a term in symbols.                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9729
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9730
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  9731
val VAR_SYMBOLS = 1;
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  9732
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  9733
val FN_SYMBOLS = 1;
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  9734
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9735
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9736
  fun sz n [] = n
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  9737
    | sz n (Var _ :: tms) = sz (n + VAR_SYMBOLS) tms
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
  9738
    | 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
  9739
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9740
  fun symbols tm = sz 0 [tm];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9741
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9742
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9743
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9744
(* A total comparison function for terms.                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9745
(* ------------------------------------------------------------------------- *)
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9748
  fun cmp [] [] = EQUAL
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9749
    | cmp (tm1 :: tms1) (tm2 :: tms2) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9750
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9751
        val tm1_tm2 = (tm1,tm2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9752
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9753
        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
  9754
        else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9755
          case tm1_tm2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9756
            (Var v1, Var v2) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9757
            (case Metis_Name.compare (v1,v2) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9758
               LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9759
             | EQUAL => cmp tms1 tms2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9760
             | GREATER => GREATER)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9761
          | (Var _, Fn _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9762
          | (Fn _, Var _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9763
          | (Fn (f1,a1), Fn (f2,a2)) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9764
            (case Metis_Name.compare (f1,f2) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9765
               LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9766
             | EQUAL =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9767
               (case Int.compare (length a1, length a2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9768
                  LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9769
                | EQUAL => cmp (a1 @ tms1) (a2 @ tms2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9770
                | GREATER => GREATER)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9771
             | GREATER => GREATER)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9772
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9773
    | cmp _ _ = raise Bug "Metis_Term.compare";
23442
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
  fun compare (tm1,tm2) = cmp [tm1] [tm2];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9776
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9777
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9778
fun equal tm1 tm2 = compare (tm1,tm2) = EQUAL;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9779
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9780
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9781
(* Subterms.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9782
(* ------------------------------------------------------------------------- *)
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
type path = int list;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9785
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9786
fun subterm tm [] = tm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9787
  | subterm (Var _) (_ :: _) = raise Error "Metis_Term.subterm: Var"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9788
  | subterm (Fn (_,tms)) (h :: t) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9789
    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
  9790
    else subterm (List.nth (tms,h)) t;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9791
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9792
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9793
  fun subtms [] acc = acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9794
    | subtms ((path,tm) :: rest) acc =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9795
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9796
        fun f (n,arg) = (n :: path, arg)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9797
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  9798
        val acc = (List.rev path, tm) :: acc
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9799
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9800
        case tm of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9801
          Var _ => subtms rest acc
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9802
        | Fn (_,args) => subtms (List.map f (enumerate args) @ rest) acc
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9803
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9804
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9805
  fun subterms tm = subtms [([],tm)] [];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9806
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9807
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9808
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
  9809
  | replace tm (h :: t, res) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9810
    case tm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9811
      Var _ => raise Error "Metis_Term.replace: Var"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9812
    | Fn (func,tms) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9813
      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
  9814
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9815
        let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9816
          val arg = List.nth (tms,h)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9817
          val arg' = replace arg (t,res)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9818
        in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9819
          if Metis_Portable.pointerEqual (arg',arg) then tm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9820
          else Fn (func, updateNth (h,arg') tms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9821
        end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9822
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9823
fun find pred =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9824
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9825
      fun search [] = NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9826
        | search ((path,tm) :: rest) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  9827
          if pred tm then SOME (List.rev path)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9828
          else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9829
            case tm of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9830
              Var _ => search rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9831
            | Fn (_,a) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9832
              let
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9833
                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
  9834
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9835
                search (subtms @ rest)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9836
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9837
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9838
      fn tm => search [([],tm)]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9839
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9840
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9841
val ppPath = Metis_Print.ppList Metis_Print.ppInt;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9842
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9843
val pathToString = Metis_Print.toString ppPath;
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9846
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9847
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9848
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9849
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9850
  fun free _ [] = false
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9851
    | 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
  9852
    | free v (Fn (_,args) :: tms) = free v (args @ tms);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9853
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9854
  fun freeIn v tm = free v [tm];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9855
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9856
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9857
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9858
  fun free vs [] = vs
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9859
    | 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
  9860
    | free vs (Fn (_,args) :: tms) = free vs (args @ tms);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9861
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9862
  val freeVarsList = free Metis_NameSet.empty;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9863
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9864
  fun freeVars tm = freeVarsList [tm];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9865
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9866
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
(* Fresh variables.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9869
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9870
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9871
fun newVar () = Var (Metis_Name.newName ());
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9872
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9873
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
  9874
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9875
local
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9876
  fun avoid av n = Metis_NameSet.member n av;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9877
in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9878
  fun variantPrime av = Metis_Name.variantPrime {avoid = avoid av};
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9879
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9880
  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
  9881
end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9882
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9883
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9884
(* Special support for terms with type annotations.                          *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9887
val hasTypeFunctionName = Metis_Name.fromString ":";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9888
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9889
val hasTypeFunction = (hasTypeFunctionName,2);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9890
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9891
fun destFnHasType ((f,a) : functionName * term list) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9892
    if not (Metis_Name.equal f hasTypeFunctionName) then
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9893
      raise Error "Metis_Term.destFnHasType"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9894
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9895
      case a of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9896
        [tm,ty] => (tm,ty)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9897
      | _ => raise Error "Metis_Term.destFnHasType";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9898
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9899
val isFnHasType = can destFnHasType;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9900
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9901
fun isTypedVar tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9902
    case tm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9903
      Var _ => true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9904
    | Fn func =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9905
      case total destFnHasType func of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9906
        SOME (Var _, _) => true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9907
      | _ => false;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9908
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9909
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9910
  fun sz n [] = n
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9911
    | sz n (tm :: tms) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9912
      case tm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9913
        Var _ => sz (n + 1) tms
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9914
      | Fn func =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9915
        case total destFnHasType func of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9916
          SOME (tm,_) => sz n (tm :: tms)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9917
        | NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9918
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9919
            val (_,a) = func
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9920
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9921
            sz (n + 1) (a @ tms)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9922
          end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9923
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9924
  fun typedSymbols tm = sz 0 [tm];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9925
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9926
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9927
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9928
  fun subtms [] acc = acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9929
    | subtms ((path,tm) :: rest) acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9930
      case tm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9931
        Var _ => subtms rest acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9932
      | Fn func =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9933
        case total destFnHasType func of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9934
          SOME (t,_) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9935
          (case t of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9936
             Var _ => subtms rest acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9937
           | Fn _ =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9938
             let
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  9939
               val acc = (List.rev path, tm) :: acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9940
               val rest = (0 :: path, t) :: rest
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9941
             in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9942
               subtms rest acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9943
             end)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9944
        | NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9945
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9946
            fun f (n,arg) = (n :: path, arg)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9947
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9948
            val (_,args) = func
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9949
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
  9950
            val acc = (List.rev path, tm) :: acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9951
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
  9952
            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
  9953
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9954
            subtms rest acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9955
          end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9956
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9957
  fun nonVarTypedSubterms tm = subtms [([],tm)] [];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9958
end;
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9961
(* Special support for terms with an explicit function application operator. *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9964
val appName = Metis_Name.fromString ".";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9965
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9966
fun mkFnApp (fTm,aTm) = (appName, [fTm,aTm]);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9967
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9968
fun mkApp f_a = Fn (mkFnApp f_a);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9969
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9970
fun destFnApp ((f,a) : Metis_Name.name * term list) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9971
    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
  9972
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9973
      case a of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9974
        [fTm,aTm] => (fTm,aTm)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9975
      | _ => raise Error "Metis_Term.destFnApp";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9976
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9977
val isFnApp = can destFnApp;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9978
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9979
fun destApp tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9980
    case tm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
  9981
      Var _ => raise Error "Metis_Term.destApp"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9982
    | Fn func => destFnApp func;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9983
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9984
val isApp = can destApp;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9985
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
  9986
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
  9987
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9988
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9989
  fun strip tms tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9990
      case total destApp tm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9991
        SOME (f,a) => strip (a :: tms) f
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9992
      | NONE => (tm,tms);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9993
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
  9994
  fun stripApp tm = strip [] tm;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9995
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9996
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
(* Parsing and pretty printing.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
  9999
(* ------------------------------------------------------------------------- *)
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
(* Operators parsed and printed infix *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10002
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10003
val infixes =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10004
    (Unsynchronized.ref o Metis_Print.Infixes)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10005
      [(* ML symbols *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10006
       {token = "/", precedence = 7, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10007
       {token = "div", precedence = 7, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10008
       {token = "mod", precedence = 7, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10009
       {token = "*", precedence = 7, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10010
       {token = "+", precedence = 6, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10011
       {token = "-", precedence = 6, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10012
       {token = "^", precedence = 6, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10013
       {token = "@", precedence = 5, assoc = Metis_Print.RightAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10014
       {token = "::", precedence = 5, assoc = Metis_Print.RightAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10015
       {token = "=", precedence = 4, assoc = Metis_Print.NonAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10016
       {token = "<>", precedence = 4, assoc = Metis_Print.NonAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10017
       {token = "<=", precedence = 4, assoc = Metis_Print.NonAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10018
       {token = "<", precedence = 4, assoc = Metis_Print.NonAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10019
       {token = ">=", precedence = 4, assoc = Metis_Print.NonAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10020
       {token = ">", precedence = 4, assoc = Metis_Print.NonAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10021
       {token = "o", precedence = 3, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10022
       {token = "->", precedence = 2, assoc = Metis_Print.RightAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10023
       {token = ":", precedence = 1, assoc = Metis_Print.NonAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10024
       {token = ",", precedence = 0, assoc = Metis_Print.RightAssoc},
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10025
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10026
       (* Logical connectives *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10027
       {token = "/\\", precedence = ~1, assoc = Metis_Print.RightAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10028
       {token = "\\/", precedence = ~2, assoc = Metis_Print.RightAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10029
       {token = "==>", precedence = ~3, assoc = Metis_Print.RightAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10030
       {token = "<=>", precedence = ~4, assoc = Metis_Print.RightAssoc},
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10031
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10032
       (* Other symbols *)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10033
       {token = ".", precedence = 9, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10034
       {token = "**", precedence = 8, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10035
       {token = "++", precedence = 6, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10036
       {token = "--", precedence = 6, assoc = Metis_Print.LeftAssoc},
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10037
       {token = "==", precedence = 4, assoc = Metis_Print.NonAssoc}];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10038
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10039
(* The negation symbol *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10040
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10041
val negation : string Unsynchronized.ref = Unsynchronized.ref "~";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10042
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10043
(* Binder symbols *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10044
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10045
val binders : string list Unsynchronized.ref = Unsynchronized.ref ["\\","!","?","?!"];
23442
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
(* Bracket symbols *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10048
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10049
val brackets : (string * string) list Unsynchronized.ref = Unsynchronized.ref [("[","]"),("{","}")];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10050
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10051
(* Pretty printing *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10052
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10053
fun pp inputTerm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10054
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10055
      val quants = !binders
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10056
      and iOps = !infixes
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10057
      and neg = !negation
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10058
      and bracks = !brackets
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10059
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10060
      val bMap =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10061
          let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10062
            fun f (b1,b2) = (b1 ^ b2, b1, b2)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10063
          in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10064
            List.map f bracks
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10065
          end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10066
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10067
      val bTokens = op@ (unzip bracks)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10068
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10069
      val iTokens = Metis_Print.tokensInfixes iOps
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10070
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10071
      fun destI tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10072
          case tm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10073
            Fn (f,[a,b]) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10074
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10075
              val f = Metis_Name.toString f
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10076
            in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10077
              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
 10078
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10079
          | _ => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10080
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10081
      fun isI tm = Option.isSome (destI tm)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10082
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10083
      fun iToken (_,tok) =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10084
          Metis_Print.program
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10085
            [(if tok = "," then Metis_Print.skip else Metis_Print.ppString " "),
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10086
             Metis_Print.ppString tok,
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 10087
             Metis_Print.break];
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10088
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10089
      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
 10090
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10091
      val specialTokens =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10092
          Metis_StringSet.addList iTokens (neg :: quants @ ["$","(",")"] @ bTokens)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10093
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10094
      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
 10095
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10096
      fun checkVarName bv n =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10097
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10098
            val s = Metis_Name.toString n
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10099
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10100
            if vName bv s then s else "$" ^ s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10101
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10102
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10103
      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
 10104
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10105
      fun checkFunctionName bv n =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10106
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10107
            val s = Metis_Name.toString n
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10108
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10109
            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
 10110
              "(" ^ s ^ ")"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10111
            else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10112
              s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10113
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10114
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10115
      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
 10116
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10117
      fun stripNeg tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10118
          case tm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10119
            Fn (f,[a]) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10120
            if Metis_Name.toString f <> neg then (0,tm)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10121
            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
 10122
          | _ => (0,tm)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10123
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10124
      val destQuant =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10125
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10126
            fun dest q (Fn (q', [Var v, body])) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10127
                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
 10128
                else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10129
                  (case dest q body of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10130
                     NONE => SOME (q,v,[],body)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10131
                   | 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
 10132
              | dest _ _ = NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10133
          in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10134
            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
 10135
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10136
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10137
      fun isQuant tm = Option.isSome (destQuant tm)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10138
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10139
      fun destBrack (Fn (b,[tm])) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10140
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10141
            val s = Metis_Name.toString b
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10142
          in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10143
            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
 10144
              NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10145
            | SOME (_,b1,b2) => SOME (b1,tm,b2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10146
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10147
        | destBrack _ = NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10148
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10149
      fun isBrack tm = Option.isSome (destBrack tm)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10150
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10151
      fun functionArgument bv tm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10152
          Metis_Print.sequence
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 10153
            Metis_Print.break
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10154
            (if isBrack tm then customBracket bv tm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10155
             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
 10156
             else bracket bv tm)
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
      and basic bv (Var v) = varName bv v
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10159
        | basic bv (Fn (f,args)) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 10160
          Metis_Print.inconsistentBlock 2
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 10161
            (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
 10162
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10163
      and customBracket bv tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10164
          case destBrack tm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10165
            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
 10166
          | NONE => basic bv tm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10167
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10168
      and innerQuant bv tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10169
          case destQuant tm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10170
            NONE => term bv tm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10171
          | SOME (q,v,vs,tm) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10172
            let
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 10173
              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
 10174
            in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10175
              Metis_Print.program
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10176
                [Metis_Print.ppString q,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10177
                 varName bv v,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10178
                 Metis_Print.program
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 10179
                   (List.map (Metis_Print.sequence Metis_Print.break o varName bv) vs),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10180
                 Metis_Print.ppString ".",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 10181
                 Metis_Print.break,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10182
                 innerQuant bv tm]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10183
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10184
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10185
      and quantifier bv tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10186
          if not (isQuant tm) then customBracket bv tm
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 10187
          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
 10188
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10189
      and molecule bv (tm,r) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10190
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10191
            val (n,tm) = stripNeg tm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10192
          in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 10193
            Metis_Print.inconsistentBlock n
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10194
              [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
 10195
               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
 10196
               else quantifier bv tm]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10197
          end
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
      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
 10200
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10201
      and bracket bv tm = Metis_Print.ppBracket "(" ")" (term bv) tm
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
      term Metis_StringSet.empty
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10204
    end inputTerm;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10205
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10206
val toString = Metis_Print.toString pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10207
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10208
(* Parsing *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10209
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10210
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10211
  open Metis_Parse;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10212
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10213
  infixr 9 >>++
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10214
  infixr 8 ++
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10215
  infixr 7 >>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10216
  infixr 6 ||
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10217
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10218
  val isAlphaNum =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10219
      let
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10220
        val alphaNumChars = String.explode "_'"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10221
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10222
        fn c => mem c alphaNumChars orelse Char.isAlphaNum c
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10223
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10224
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10225
  local
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10226
    val alphaNumToken = atLeastOne (some isAlphaNum) >> String.implode;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10227
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10228
    val symbolToken =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10229
        let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10230
          fun isNeg c = str c = !negation
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10231
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10232
          val symbolChars = String.explode "<>=-*+/\\?@|!$%&#^:;~"
23442
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
          fun isSymbol c = mem c symbolChars
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10235
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10236
          fun isNonNegSymbol c = not (isNeg c) andalso isSymbol c
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10237
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10238
          some isNeg >> str ||
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10239
          (some isNonNegSymbol ++ many (some isSymbol)) >>
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10240
          (String.implode o op::)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10241
        end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10242
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10243
    val punctToken =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10244
        let
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10245
          val punctChars = String.explode "()[]{}.,"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10246
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10247
          fun isPunct c = mem c punctChars
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10248
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10249
          some isPunct >> str
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10250
        end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10251
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10252
    val lexToken = alphaNumToken || symbolToken || punctToken;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10253
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10254
    val space = many (some Char.isSpace);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10255
  in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10256
    val lexer = (space ++ lexToken ++ space) >> (fn (_,(tok,_)) => tok);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10257
  end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10258
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10259
  fun termParser inputStream =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10260
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10261
        val quants = !binders
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10262
        and iOps = !infixes
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10263
        and neg = !negation
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10264
        and bracks = ("(",")") :: !brackets
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10265
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 10266
        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
 10267
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 10268
        val bTokens = List.map #2 bracks @ List.map #3 bracks
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10269
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10270
        fun possibleVarName "" = false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10271
          | possibleVarName s = isAlphaNum (String.sub (s,0))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10272
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10273
        fun vName bv s = Metis_StringSet.member s bv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10274
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10275
        val iTokens = Metis_Print.tokensInfixes iOps
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10276
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10277
        fun iMk (f,a,b) = Fn (Metis_Name.fromString f, [a,b])
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10278
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10279
        val iParser = parseInfixes iOps iMk any
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10280
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10281
        val specialTokens =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10282
            Metis_StringSet.addList iTokens (neg :: quants @ ["$"] @ bTokens)
23442
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
        fun varName bv =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10285
            some (vName bv) ||
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10286
            (some (Metis_Useful.equal "$") ++ some possibleVarName) >> snd
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10287
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10288
        fun fName bv s =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10289
            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
 10290
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10291
        fun functionName bv =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10292
            some (fName bv) ||
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10293
            (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
 10294
            (fn (_,(s,_)) => s)
23442
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
        fun basic bv tokens =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10297
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10298
              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
 10299
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10300
              val const =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10301
                  functionName bv >> (fn f => Fn (Metis_Name.fromString f, []))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10302
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10303
              fun bracket (ab,a,b) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10304
                  (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
 10305
                  (fn (_,(tm,_)) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10306
                      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
 10307
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10308
              fun quantifier q =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10309
                  let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10310
                    fun bind (v,t) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10311
                        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
 10312
                  in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10313
                    (some (Metis_Useful.equal q) ++
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10314
                     atLeastOne (some possibleVarName) ++
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10315
                     some (Metis_Useful.equal ".")) >>++
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10316
                    (fn (_,(vs,_)) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10317
                        term (Metis_StringSet.addList bv vs) >>
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10318
                        (fn body => List.foldr bind body vs))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10319
                  end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10320
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10321
              var ||
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10322
              const ||
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 10323
              first (List.map bracket bracks) ||
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 10324
              first (List.map quantifier quants)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10325
            end tokens
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10326
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10327
        and molecule bv tokens =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10328
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10329
              val negations = many (some (Metis_Useful.equal neg)) >> length
23442
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
              val function =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10332
                  (functionName bv ++ many (basic bv)) >>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10333
                  (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
 10334
                  basic bv
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10335
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10336
              (negations ++ function) >>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10337
              (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
 10338
            end tokens
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
        and term bv tokens = iParser (molecule bv) tokens
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10341
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10342
        term Metis_StringSet.empty
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10343
      end inputStream;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10344
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10345
  fun fromString input =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10346
      let
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10347
        val chars = Metis_Stream.fromList (String.explode input)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10348
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10349
        val tokens = everything (lexer >> singleton) chars
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10350
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10351
        val terms = everything (termParser >> singleton) tokens
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10352
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10353
        case Metis_Stream.toList terms of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10354
          [tm] => tm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10355
        | _ => raise Error "Metis_Term.fromString"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10356
      end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10357
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10358
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10359
local
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10360
  val antiquotedTermToString =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10361
      Metis_Print.toString (Metis_Print.ppBracket "(" ")" pp);
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10362
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10363
  val parse = Metis_Parse.parseQuotation antiquotedTermToString fromString;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10364
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10365
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10366
end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10367
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10368
structure Metis_TermOrdered =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10369
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
 10370
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10371
structure Metis_TermMap = Metis_KeyMap (Metis_TermOrdered);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10372
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10373
structure Metis_TermSet = Metis_ElementSet (Metis_TermMap);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10374
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10375
(**** Original file: src/Subst.sig ****)
23442
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
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10378
(* FIRST ORDER LOGIC SUBSTITUTIONS                                           *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 10379
(* Copyright (c) 2002 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10380
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10381
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10382
signature Metis_Subst =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10383
sig
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10386
(* A type of first order logic substitutions.                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10387
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10388
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10389
type subst
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10390
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10391
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10392
(* Basic operations.                                                         *)
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10395
val empty : subst
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10396
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10397
val null : subst -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10398
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10399
val size : subst -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10400
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10401
val peek : subst -> Metis_Term.var -> Metis_Term.term option
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10402
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10403
val insert : subst -> Metis_Term.var * Metis_Term.term -> subst
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10404
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10405
val singleton : Metis_Term.var * Metis_Term.term -> subst
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10406
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10407
val toList : subst -> (Metis_Term.var * Metis_Term.term) list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10408
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10409
val fromList : (Metis_Term.var * Metis_Term.term) list -> subst
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10410
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10411
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
 10412
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10413
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
 10414
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10415
val pp : subst Metis_Print.pp
23442
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
val toString : subst -> string
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10420
(* Normalizing removes identity substitutions.                               *)
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10423
val normalize : subst -> subst
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10424
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10425
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10426
(* Applying a substitution to a first order logic term.                      *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10429
val subst : subst -> Metis_Term.term -> Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10430
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
(* Restricting a substitution to a smaller set of variables.                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10433
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10434
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10435
val restrict : subst -> Metis_NameSet.set -> subst
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10436
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10437
val remove : subst -> Metis_NameSet.set -> subst
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10438
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10439
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10440
(* Composing two substitutions so that the following identity holds:         *)
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
(* subst (compose sub1 sub2) tm = subst sub2 (subst sub1 tm)                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10443
(* ------------------------------------------------------------------------- *)
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
val compose : subst -> subst -> subst
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10446
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10447
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10448
(* Creating the union of two compatible substitutions.                       *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10449
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10450
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10451
val union : subst -> subst -> subst  (* raises Error *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10452
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10453
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10454
(* Substitutions can be inverted iff they are renaming substitutions.        *)
23442
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10457
val invert : subst -> subst  (* raises Error *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10458
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10459
val isRenaming : subst -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10460
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
(* Creating a substitution to freshen variables.                             *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10465
val freshVars : Metis_NameSet.set -> subst
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10466
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10467
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10468
(* Free variables.                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10469
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10470
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10471
val redexes : subst -> Metis_NameSet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10472
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10473
val residueFreeVars : subst -> Metis_NameSet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10474
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10475
val freeVars : subst -> Metis_NameSet.set
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10476
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10477
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10478
(* Functions.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10479
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10480
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10481
val functions : subst -> Metis_NameAritySet.set
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10482
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10483
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10484
(* Matching for first order logic terms.                                     *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10487
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
 10488
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10489
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10490
(* Unification for first order logic terms.                                  *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10491
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10492
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10493
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
 10494
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10495
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10496
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10497
(**** Original file: src/Subst.sml ****)
23442
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
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10500
(* FIRST ORDER LOGIC SUBSTITUTIONS                                           *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 10501
(* Copyright (c) 2002 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10502
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10503
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10504
structure Metis_Subst :> Metis_Subst =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10505
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10506
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10507
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10508
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
(* A type of first order logic substitutions.                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10511
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10512
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10513
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
 10514
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
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10517
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10518
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10519
val empty = Metis_Subst (Metis_NameMap.new ());
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10520
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10521
fun null (Metis_Subst m) = Metis_NameMap.null m;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10522
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10523
fun size (Metis_Subst m) = Metis_NameMap.size m;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10524
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10525
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
 10526
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10527
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
 10528
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10529
fun singleton v_tm = insert empty v_tm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10530
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10531
fun toList (Metis_Subst m) = Metis_NameMap.toList m;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10532
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10533
fun fromList l = Metis_Subst (Metis_NameMap.fromList l);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10534
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10535
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
 10536
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10537
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
 10538
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10539
fun pp sub =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10540
    Metis_Print.ppBracket "<[" "]>"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10541
      (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
 10542
      (toList sub);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10543
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10544
val toString = Metis_Print.toString pp;
23442
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10547
(* Normalizing removes identity substitutions.                               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10548
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10549
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10550
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10551
  fun isNotId (v,tm) = not (Metis_Term.equalVar v tm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10552
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10553
  fun normalize (sub as Metis_Subst m) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10554
      let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10555
        val m' = Metis_NameMap.filter isNotId m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10556
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10557
        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
 10558
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10559
end;
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
(* Applying a substitution to a first order logic term.                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10563
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10564
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10565
fun subst sub =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10566
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10567
      fun tmSub (tm as Metis_Term.Var v) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10568
          (case peek sub v of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10569
             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
 10570
           | NONE => tm)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10571
        | tmSub (tm as Metis_Term.Fn (f,args)) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10572
          let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10573
            val args' = Metis_Sharing.map tmSub args
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10574
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10575
            if Metis_Portable.pointerEqual (args,args') then tm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10576
            else Metis_Term.Fn (f,args')
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10577
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10578
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10579
      fn tm => if null sub then tm else tmSub tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10580
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10581
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10582
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10583
(* Restricting a substitution to a given set of variables.                   *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10586
fun restrict (sub as Metis_Subst m) varSet =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10587
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10588
      fun isRestrictedVar (v,_) = Metis_NameSet.member v varSet
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10589
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10590
      val m' = Metis_NameMap.filter isRestrictedVar m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10591
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10592
      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
 10593
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10594
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10595
fun remove (sub as Metis_Subst m) varSet =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10596
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10597
      fun isRestrictedVar (v,_) = not (Metis_NameSet.member v varSet)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10598
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10599
      val m' = Metis_NameMap.filter isRestrictedVar m
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10600
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10601
      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
 10602
    end;
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10605
(* Composing two substitutions so that the following identity holds:         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10606
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10607
(* subst (compose sub1 sub2) tm = subst sub2 (subst sub1 tm)                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10608
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10609
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10610
fun compose (sub1 as Metis_Subst m1) sub2 =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10611
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10612
      fun f (v,tm,s) = insert s (v, subst sub2 tm)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10613
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10614
      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
 10615
    end;
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
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10618
(* Creating the union of two compatible substitutions.                       *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10619
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10620
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10621
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10622
  fun compatible ((_,tm1),(_,tm2)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10623
      if Metis_Term.equal tm1 tm2 then SOME tm1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10624
      else raise Error "Metis_Subst.union: incompatible";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10625
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10626
  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
 10627
      if Metis_NameMap.null m1 then s2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10628
      else if Metis_NameMap.null m2 then s1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10629
      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
 10630
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10631
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10632
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10633
(* Substitutions can be inverted iff they are renaming substitutions.        *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10634
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10635
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10636
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10637
  fun inv (v, Metis_Term.Var w, s) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10638
      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
 10639
      else Metis_NameMap.insert s (w, Metis_Term.Var v)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10640
    | 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
 10641
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10642
  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
 10643
end;
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
val isRenaming = can invert;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10646
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
(* Creating a substitution to freshen variables.                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10649
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10650
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10651
val freshVars =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10652
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10653
      fun add (v,m) = insert m (v, Metis_Term.newVar ())
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10654
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10655
      Metis_NameSet.foldl add empty
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10656
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10657
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10658
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10659
(* Free variables.                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10660
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10661
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10662
val redexes =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10663
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10664
      fun add (v,_,s) = Metis_NameSet.add s v
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10665
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10666
      foldl add Metis_NameSet.empty
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10667
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10668
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10669
val residueFreeVars =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10670
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10671
      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
 10672
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10673
      foldl add Metis_NameSet.empty
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10674
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10675
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10676
val freeVars =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10677
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10678
      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
 10679
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10680
      foldl add Metis_NameSet.empty
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10681
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10682
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10683
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10684
(* Functions.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10685
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10686
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10687
val functions =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10688
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10689
      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
 10690
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10691
      foldl add Metis_NameAritySet.empty
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10692
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10693
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10694
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10695
(* Matching for first order logic terms.                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10696
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10697
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10698
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10699
  fun matchList sub [] = sub
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10700
    | matchList sub ((Metis_Term.Var v, tm) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10701
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10702
        val sub =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10703
            case peek sub v of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10704
              NONE => insert sub (v,tm)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10705
            | SOME tm' =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10706
              if Metis_Term.equal tm tm' then sub
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10707
              else raise Error "Metis_Subst.match: incompatible matches"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10708
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10709
        matchList sub rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10710
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10711
    | 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
 10712
      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
 10713
        matchList sub (zip args1 args2 @ rest)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10714
      else raise Error "Metis_Subst.match: different structure"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10715
    | 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
 10716
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10717
  fun match sub tm1 tm2 = matchList sub [(tm1,tm2)];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10718
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10719
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10720
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10721
(* Unification for first order logic terms.                                  *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10722
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10723
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10724
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10725
  fun solve sub [] = sub
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10726
    | solve sub ((tm1_tm2 as (tm1,tm2)) :: rest) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10727
      if Metis_Portable.pointerEqual tm1_tm2 then solve sub rest
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10728
      else solve' sub (subst sub tm1) (subst sub tm2) rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10729
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10730
  and solve' sub (Metis_Term.Var v) tm rest =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10731
      if Metis_Term.equalVar v tm then solve sub rest
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10732
      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
 10733
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10734
        (case peek sub v of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10735
           NONE => solve (compose sub (singleton (v,tm))) rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10736
         | SOME tm' => solve' sub tm' tm rest)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10737
    | 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
 10738
    | 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
 10739
      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
 10740
        solve sub (zip args1 args2 @ rest)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10741
      else
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10742
        raise Error "Metis_Subst.unify: different structure";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10743
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10744
  fun unify sub tm1 tm2 = solve sub [(tm1,tm2)];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10745
end;
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
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10748
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10749
(**** Original file: src/Atom.sig ****)
23442
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
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10752
(* FIRST ORDER LOGIC ATOMS                                                   *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 10753
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10756
signature Metis_Atom =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10757
sig
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10760
(* A type for storing first order logic atoms.                               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10761
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10762
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10763
type relationName = Metis_Name.name
23442
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
type relation = relationName * int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10766
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10767
type atom = relationName * Metis_Term.term list
23442
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10770
(* Constructors and destructors.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10771
(* ------------------------------------------------------------------------- *)
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
val name : atom -> relationName
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 arguments : atom -> Metis_Term.term list
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 arity : atom -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10778
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10779
val relation : atom -> relation
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10780
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10781
val functions : atom -> Metis_NameAritySet.set
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 functionNames : atom -> Metis_NameSet.set
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
(* Binary relations *)
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 mkBinop : relationName -> Metis_Term.term * Metis_Term.term -> atom
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10788
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10789
val destBinop : relationName -> atom -> Metis_Term.term * Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10790
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10791
val isBinop : relationName -> atom -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10792
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10793
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10794
(* The size of an atom in symbols.                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10795
(* ------------------------------------------------------------------------- *)
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
val symbols : atom -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10798
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
(* A total comparison function for atoms.                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10801
(* ------------------------------------------------------------------------- *)
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
val compare : atom * atom -> order
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10804
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10805
val equal : atom -> atom -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10806
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10807
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10808
(* Subterms.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10809
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10810
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10811
val subterm : atom -> Metis_Term.path -> Metis_Term.term
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10812
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10813
val subterms : atom -> (Metis_Term.path * Metis_Term.term) list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10814
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10815
val replace : atom -> Metis_Term.path * Metis_Term.term -> atom
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 find : (Metis_Term.term -> bool) -> atom -> Metis_Term.path option
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10818
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10819
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10820
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10821
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10822
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10823
val freeIn : Metis_Term.var -> atom -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10824
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10825
val freeVars : atom -> Metis_NameSet.set
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10826
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
(* Substitutions.                                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10829
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10830
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10831
val subst : Metis_Subst.subst -> atom -> atom
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10832
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
(* Matching.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10835
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10836
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10837
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
 10838
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10839
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10840
(* Unification.                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10841
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10842
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10843
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
 10844
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10845
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10846
(* The equality relation.                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10847
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10848
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10849
val eqRelationName : relationName
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10850
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10851
val eqRelation : relation
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10852
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10853
val mkEq : Metis_Term.term * Metis_Term.term -> atom
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10854
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10855
val destEq : atom -> Metis_Term.term * Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10856
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10857
val isEq : atom -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10858
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10859
val mkRefl : Metis_Term.term -> atom
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10860
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10861
val destRefl : atom -> Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10862
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10863
val isRefl : atom -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10864
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10865
val sym : atom -> atom  (* raises Error if given a refl *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10866
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10867
val lhs : atom -> Metis_Term.term
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10868
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10869
val rhs : atom -> Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10870
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10871
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10872
(* Special support for terms with type annotations.                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10873
(* ------------------------------------------------------------------------- *)
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 typedSymbols : atom -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10876
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10877
val nonVarTypedSubterms : atom -> (Metis_Term.path * Metis_Term.term) list
23442
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10880
(* Parsing and pretty printing.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10881
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10882
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10883
val pp : atom Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10884
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10885
val toString : atom -> string
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
val fromString : string -> atom
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10888
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10889
val parse : Metis_Term.term Metis_Parse.quotation -> atom
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10890
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10891
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10892
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10893
(**** Original file: src/Atom.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10894
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
(* FIRST ORDER LOGIC ATOMS                                                   *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 10897
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10898
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10899
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10900
structure Metis_Atom :> Metis_Atom =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10901
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10902
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10903
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10904
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10905
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10906
(* A type for storing first order logic atoms.                               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10907
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10908
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10909
type relationName = Metis_Name.name;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10910
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10911
type relation = relationName * int;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10912
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10913
type atom = relationName * Metis_Term.term list;
23442
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10916
(* Constructors and destructors.                                             *)
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10919
fun name ((rel,_) : atom) = rel;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10920
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10921
fun arguments ((_,args) : atom) = args;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10922
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10923
fun arity atm = length (arguments atm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10924
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10925
fun relation atm = (name atm, arity atm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10926
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10927
val functions =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10928
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10929
      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
 10930
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10931
      fn atm => List.foldl f Metis_NameAritySet.empty (arguments atm)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10932
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10933
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10934
val functionNames =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10935
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10936
      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
 10937
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10938
      fn atm => List.foldl f Metis_NameSet.empty (arguments atm)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10939
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10940
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10941
(* Binary relations *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10942
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10943
fun mkBinop p (a,b) : atom = (p,[a,b]);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10944
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10945
fun destBinop p (x,[a,b]) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10946
    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
 10947
  | destBinop _ _ = raise Error "Metis_Atom.destBinop: not a binop";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10948
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10949
fun isBinop p = can (destBinop p);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10950
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10951
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10952
(* The size of an atom in symbols.                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10953
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10954
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10955
fun symbols atm =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10956
    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
 10957
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10958
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10959
(* A total comparison function for atoms.                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10960
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10961
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10962
fun compare ((p1,tms1),(p2,tms2)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10963
    case Metis_Name.compare (p1,p2) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10964
      LESS => LESS
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10965
    | EQUAL => lexCompare Metis_Term.compare (tms1,tms2)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10966
    | GREATER => GREATER;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10967
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10968
fun equal atm1 atm2 = compare (atm1,atm2) = EQUAL;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 10969
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10970
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10971
(* Subterms.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10972
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10973
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10974
fun subterm _ [] = raise Bug "Metis_Atom.subterm: empty path"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10975
  | subterm ((_,tms) : atom) (h :: t) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10976
    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
 10977
    else Metis_Term.subterm (List.nth (tms,h)) t;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10978
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10979
fun subterms ((_,tms) : atom) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10980
    let
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 10981
      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
 10982
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 10983
      List.foldl f [] (enumerate tms)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10984
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10985
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10986
fun replace _ ([],_) = raise Bug "Metis_Atom.replace: empty path"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10987
  | replace (atm as (rel,tms)) (h :: t, res) : atom =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10988
    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
 10989
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10990
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10991
        val tm = List.nth (tms,h)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10992
        val tm' = Metis_Term.replace tm (t,res)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10993
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 10994
        if Metis_Portable.pointerEqual (tm,tm') then atm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10995
        else (rel, updateNth (h,tm') tms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10996
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10997
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10998
fun find pred =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 10999
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11000
      fun f (i,tm) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11001
          case Metis_Term.find pred tm of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11002
            SOME path => SOME (i :: path)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11003
          | NONE => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11004
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11005
      fn (_,tms) : atom => first f (enumerate tms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11006
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11007
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11008
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11009
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11010
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11011
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11012
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
 11013
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11014
val freeVars =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11015
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11016
      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
 11017
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 11018
      fn atm => List.foldl f Metis_NameSet.empty (arguments atm)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11019
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11020
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11021
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11022
(* Substitutions.                                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11023
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11024
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11025
fun subst sub (atm as (p,tms)) : atom =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11026
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11027
      val tms' = Metis_Sharing.map (Metis_Subst.subst sub) tms
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11028
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11029
      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
 11030
    end;
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11033
(* Matching.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11034
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11035
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11036
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11037
  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
 11038
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11039
  fun match sub (p1,tms1) (p2,tms2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11040
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11041
        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
 11042
                raise Error "Metis_Atom.match"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11043
      in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 11044
        List.foldl matchArg sub (zip tms1 tms2)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11045
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11046
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11047
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11048
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11049
(* Unification.                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11050
(* ------------------------------------------------------------------------- *)
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
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11053
  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
 11054
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11055
  fun unify sub (p1,tms1) (p2,tms2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11056
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11057
        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
 11058
                raise Error "Metis_Atom.unify"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11059
      in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 11060
        List.foldl unifyArg sub (zip tms1 tms2)
23442
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
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11063
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11064
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11065
(* The equality relation.                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11066
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11067
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11068
val eqRelationName = Metis_Name.fromString "=";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11069
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11070
val eqRelationArity = 2;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11071
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11072
val eqRelation = (eqRelationName,eqRelationArity);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11073
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11074
val mkEq = mkBinop eqRelationName;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11075
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11076
fun destEq x = destBinop eqRelationName x;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11077
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11078
fun isEq x = isBinop eqRelationName x;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11079
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11080
fun mkRefl tm = mkEq (tm,tm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11081
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11082
fun destRefl atm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11083
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11084
      val (l,r) = destEq atm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11085
      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
 11086
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11087
      l
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11088
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11089
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11090
fun isRefl x = can destRefl x;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11091
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11092
fun sym atm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11093
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11094
      val (l,r) = destEq atm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11095
      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
 11096
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11097
      mkEq (r,l)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11098
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11099
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11100
fun lhs atm = fst (destEq atm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11101
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11102
fun rhs atm = snd (destEq atm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11103
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11104
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11105
(* Special support for terms with type annotations.                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11106
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11107
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11108
fun typedSymbols ((_,tms) : atom) =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 11109
    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
 11110
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11111
fun nonVarTypedSubterms (_,tms) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11112
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11113
      fun addArg ((n,arg),acc) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11114
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11115
            fun addTm ((path,tm),acc) = (n :: path, tm) :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11116
          in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 11117
            List.foldl addTm acc (Metis_Term.nonVarTypedSubterms arg)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 11118
          end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 11119
    in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 11120
      List.foldl addArg [] (enumerate tms)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11121
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11122
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11123
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11124
(* Parsing and pretty printing.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11125
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11126
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11127
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
 11128
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11129
val toString = Metis_Print.toString pp;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11130
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11131
fun fromString s = Metis_Term.destFn (Metis_Term.fromString s);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11132
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11133
val parse = Metis_Parse.parseQuotation Metis_Term.toString fromString;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11134
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11135
end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11136
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11137
structure Metis_AtomOrdered =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11138
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
 11139
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11140
structure Metis_AtomMap = Metis_KeyMap (Metis_AtomOrdered);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11141
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11142
structure Metis_AtomSet = Metis_ElementSet (Metis_AtomMap);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11143
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 11144
(**** Original file: src/Formula.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11145
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11146
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11147
(* FIRST ORDER LOGIC FORMULAS                                                *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 11148
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11149
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11150
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11151
signature Metis_Formula =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11152
sig
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 type of first order logic 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
datatype formula =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11159
    True
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11160
  | False
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11161
  | Metis_Atom of Metis_Atom.atom
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11162
  | Not of formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11163
  | And of formula * formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11164
  | Or of formula * formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11165
  | Imp of formula * formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11166
  | Iff of formula * formula
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11167
  | Forall of Metis_Term.var * formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11168
  | Exists of Metis_Term.var * formula
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11169
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11170
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11171
(* Constructors and destructors.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11172
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11173
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11174
(* Booleans *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11175
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11176
val mkBoolean : bool -> formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11177
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11178
val destBoolean : formula -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11179
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11180
val isBoolean : formula -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11181
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11182
val isTrue : formula -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11183
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11184
val isFalse : formula -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11185
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11186
(* Functions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11187
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11188
val functions : formula -> Metis_NameAritySet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11189
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11190
val functionNames : formula -> Metis_NameSet.set
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11191
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11192
(* Relations *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11193
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11194
val relations : formula -> Metis_NameAritySet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11195
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11196
val relationNames : formula -> Metis_NameSet.set
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11197
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11198
(* Atoms *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11199
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11200
val destAtom : formula -> Metis_Atom.atom
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11201
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11202
val isAtom : formula -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11203
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11204
(* Negations *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11205
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11206
val destNeg : formula -> formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11207
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11208
val isNeg : formula -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11209
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11210
val stripNeg : formula -> int * formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11211
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11212
(* Conjunctions *)
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
val listMkConj : formula list -> formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11215
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11216
val stripConj : formula -> formula list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11217
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11218
val flattenConj : formula -> formula list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11219
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11220
(* Disjunctions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11221
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11222
val listMkDisj : formula list -> formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11223
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11224
val stripDisj : formula -> formula list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11225
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11226
val flattenDisj : formula -> formula list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11227
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11228
(* Equivalences *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11229
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11230
val listMkEquiv : formula list -> formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11231
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11232
val stripEquiv : formula -> formula list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11233
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11234
val flattenEquiv : formula -> formula list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11235
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11236
(* Universal quantification *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11237
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11238
val destForall : formula -> Metis_Term.var * formula
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11239
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11240
val isForall : formula -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11241
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11242
val listMkForall : Metis_Term.var list * formula -> formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11243
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11244
val setMkForall : Metis_NameSet.set * formula -> formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11245
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11246
val stripForall : formula -> Metis_Term.var list * formula
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11247
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11248
(* Existential quantification *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11249
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11250
val destExists : formula -> Metis_Term.var * formula
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11251
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11252
val isExists : formula -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11253
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11254
val listMkExists : Metis_Term.var list * formula -> formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11255
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11256
val setMkExists : Metis_NameSet.set * formula -> formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11257
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11258
val stripExists : formula -> Metis_Term.var list * formula
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11259
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
(* The size of a formula in symbols.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11262
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11263
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11264
val symbols : formula -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11265
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11266
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11267
(* A total comparison function for formulas.                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11268
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11269
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11270
val compare : formula * formula -> order
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11271
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11272
val equal : formula -> formula -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11273
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11274
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11275
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11276
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11277
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11278
val freeIn : Metis_Term.var -> formula -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11279
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11280
val freeVars : formula -> Metis_NameSet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11281
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11282
val freeVarsList : formula list -> Metis_NameSet.set
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11283
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11284
val specialize : formula -> formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11285
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11286
val generalize : formula -> formula
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11289
(* Substitutions.                                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11290
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11291
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11292
val subst : Metis_Subst.subst -> formula -> formula
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11293
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11294
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11295
(* The equality relation.                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11296
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11297
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11298
val mkEq : Metis_Term.term * Metis_Term.term -> formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11299
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11300
val destEq : formula -> Metis_Term.term * Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11301
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11302
val isEq : formula -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11303
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11304
val mkNeq : Metis_Term.term * Metis_Term.term -> formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11305
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11306
val destNeq : formula -> Metis_Term.term * Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11307
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11308
val isNeq : formula -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11309
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11310
val mkRefl : Metis_Term.term -> formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11311
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11312
val destRefl : formula -> Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11313
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11314
val isRefl : formula -> bool
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 sym : formula -> formula  (* raises Error if given a refl *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11317
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11318
val lhs : formula -> Metis_Term.term
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11319
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11320
val rhs : formula -> Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11321
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11322
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11323
(* Splitting goals.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11324
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11325
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11326
val splitGoal : formula -> formula list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11327
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11328
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11329
(* Parsing and pretty-printing.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11330
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11331
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11332
type quotation = formula Metis_Parse.quotation
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11333
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11334
val pp : formula Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11335
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11336
val toString : formula -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11337
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11338
val fromString : string -> formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11339
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11340
val parse : quotation -> formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11341
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11342
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11343
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 11344
(**** Original file: src/Formula.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11345
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11346
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11347
(* FIRST ORDER LOGIC FORMULAS                                                *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 11348
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11351
structure Metis_Formula :> Metis_Formula =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11352
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11353
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11354
open Metis_Useful;
23442
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11357
(* A type of first order logic formulas.                                     *)
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11360
datatype formula =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11361
    True
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11362
  | False
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11363
  | Metis_Atom of Metis_Atom.atom
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11364
  | Not of formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11365
  | And of formula * formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11366
  | Or of formula * formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11367
  | Imp of formula * formula
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11368
  | Iff of formula * formula
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11369
  | Forall of Metis_Term.var * formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11370
  | Exists of Metis_Term.var * formula;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11371
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11372
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11373
(* Constructors and destructors.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11374
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11375
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11376
(* Booleans *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11377
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11378
fun mkBoolean true = True
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11379
  | mkBoolean false = False;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11380
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11381
fun destBoolean True = true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11382
  | destBoolean False = false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11383
  | destBoolean _ = raise Error "destBoolean";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11384
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11385
val isBoolean = can destBoolean;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11386
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11387
fun isTrue fm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11388
    case fm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11389
      True => true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11390
    | _ => false;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11391
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11392
fun isFalse fm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11393
    case fm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11394
      False => true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11395
    | _ => false;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11396
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11397
(* Functions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11398
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11399
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11400
  fun funcs fs [] = fs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11401
    | funcs fs (True :: fms) = funcs fs fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11402
    | funcs fs (False :: fms) = funcs fs fms
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11403
    | funcs fs (Metis_Atom atm :: fms) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11404
      funcs (Metis_NameAritySet.union (Metis_Atom.functions atm) fs) fms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11405
    | funcs fs (Not p :: fms) = funcs fs (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11406
    | funcs fs (And (p,q) :: fms) = funcs fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11407
    | funcs fs (Or (p,q) :: fms) = funcs fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11408
    | funcs fs (Imp (p,q) :: fms) = funcs fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11409
    | funcs fs (Iff (p,q) :: fms) = funcs fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11410
    | funcs fs (Forall (_,p) :: fms) = funcs fs (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11411
    | funcs fs (Exists (_,p) :: fms) = funcs fs (p :: fms);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11412
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11413
  fun functions fm = funcs Metis_NameAritySet.empty [fm];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11414
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11415
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11416
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11417
  fun funcs fs [] = fs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11418
    | funcs fs (True :: fms) = funcs fs fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11419
    | funcs fs (False :: fms) = funcs fs fms
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11420
    | funcs fs (Metis_Atom atm :: fms) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11421
      funcs (Metis_NameSet.union (Metis_Atom.functionNames atm) fs) fms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11422
    | funcs fs (Not p :: fms) = funcs fs (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11423
    | funcs fs (And (p,q) :: fms) = funcs fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11424
    | funcs fs (Or (p,q) :: fms) = funcs fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11425
    | funcs fs (Imp (p,q) :: fms) = funcs fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11426
    | funcs fs (Iff (p,q) :: fms) = funcs fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11427
    | funcs fs (Forall (_,p) :: fms) = funcs fs (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11428
    | funcs fs (Exists (_,p) :: fms) = funcs fs (p :: fms);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11429
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11430
  fun functionNames fm = funcs Metis_NameSet.empty [fm];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11431
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11432
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11433
(* Relations *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11434
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11435
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11436
  fun rels fs [] = fs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11437
    | rels fs (True :: fms) = rels fs fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11438
    | rels fs (False :: fms) = rels fs fms
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11439
    | rels fs (Metis_Atom atm :: fms) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11440
      rels (Metis_NameAritySet.add fs (Metis_Atom.relation atm)) fms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11441
    | rels fs (Not p :: fms) = rels fs (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11442
    | rels fs (And (p,q) :: fms) = rels fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11443
    | rels fs (Or (p,q) :: fms) = rels fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11444
    | rels fs (Imp (p,q) :: fms) = rels fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11445
    | rels fs (Iff (p,q) :: fms) = rels fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11446
    | rels fs (Forall (_,p) :: fms) = rels fs (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11447
    | rels fs (Exists (_,p) :: fms) = rels fs (p :: fms);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11448
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11449
  fun relations fm = rels Metis_NameAritySet.empty [fm];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11450
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11451
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11452
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11453
  fun rels fs [] = fs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11454
    | rels fs (True :: fms) = rels fs fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11455
    | rels fs (False :: fms) = rels fs fms
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11456
    | 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
 11457
    | rels fs (Not p :: fms) = rels fs (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11458
    | rels fs (And (p,q) :: fms) = rels fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11459
    | rels fs (Or (p,q) :: fms) = rels fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11460
    | rels fs (Imp (p,q) :: fms) = rels fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11461
    | rels fs (Iff (p,q) :: fms) = rels fs (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11462
    | rels fs (Forall (_,p) :: fms) = rels fs (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11463
    | rels fs (Exists (_,p) :: fms) = rels fs (p :: fms);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11464
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11465
  fun relationNames fm = rels Metis_NameSet.empty [fm];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11466
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11467
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11468
(* Atoms *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11469
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11470
fun destAtom (Metis_Atom atm) = atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11471
  | destAtom _ = raise Error "Metis_Formula.destAtom";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11472
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11473
val isAtom = can destAtom;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11474
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11475
(* Negations *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11476
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11477
fun destNeg (Not p) = p
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11478
  | destNeg _ = raise Error "Metis_Formula.destNeg";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11479
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11480
val isNeg = can destNeg;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11481
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11482
val stripNeg =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11483
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11484
      fun strip n (Not fm) = strip (n + 1) fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11485
        | strip n fm = (n,fm)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11486
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11487
      strip 0
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11488
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11489
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11490
(* Conjunctions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11491
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11492
fun listMkConj fms =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 11493
    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
 11494
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11495
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11496
  fun strip cs (And (p,q)) = strip (p :: cs) q
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 11497
    | strip cs fm = List.rev (fm :: cs);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11498
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11499
  fun stripConj True = []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11500
    | stripConj fm = strip [] fm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11501
end;
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
val flattenConj =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11504
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11505
      fun flat acc [] = acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11506
        | flat acc (And (p,q) :: fms) = flat acc (q :: p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11507
        | flat acc (True :: fms) = flat acc fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11508
        | flat acc (fm :: fms) = flat (fm :: acc) fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11509
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11510
      fn fm => flat [] [fm]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11511
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11512
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11513
(* Disjunctions *)
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
fun listMkDisj fms =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 11516
    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
 11517
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11518
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11519
  fun strip cs (Or (p,q)) = strip (p :: cs) q
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 11520
    | strip cs fm = List.rev (fm :: cs);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11521
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11522
  fun stripDisj False = []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11523
    | stripDisj fm = strip [] fm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11524
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11525
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11526
val flattenDisj =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11527
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11528
      fun flat acc [] = acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11529
        | flat acc (Or (p,q) :: fms) = flat acc (q :: p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11530
        | flat acc (False :: fms) = flat acc fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11531
        | flat acc (fm :: fms) = flat (fm :: acc) fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11532
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11533
      fn fm => flat [] [fm]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11534
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11535
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11536
(* Equivalences *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11537
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11538
fun listMkEquiv fms =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 11539
    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
 11540
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11541
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11542
  fun strip cs (Iff (p,q)) = strip (p :: cs) q
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 11543
    | strip cs fm = List.rev (fm :: cs);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11544
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11545
  fun stripEquiv True = []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11546
    | stripEquiv fm = strip [] fm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11547
end;
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
val flattenEquiv =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11550
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11551
      fun flat acc [] = acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11552
        | flat acc (Iff (p,q) :: fms) = flat acc (q :: p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11553
        | flat acc (True :: fms) = flat acc fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11554
        | flat acc (fm :: fms) = flat (fm :: acc) fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11555
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11556
      fn fm => flat [] [fm]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11557
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11558
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11559
(* Universal quantifiers *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11560
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11561
fun destForall (Forall v_f) = v_f
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11562
  | destForall _ = raise Error "destForall";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11563
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11564
val isForall = can destForall;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11565
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11566
fun listMkForall ([],body) = body
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11567
  | listMkForall (v :: vs, body) = Forall (v, listMkForall (vs,body));
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11568
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11569
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
 11570
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11571
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11572
  fun strip vs (Forall (v,b)) = strip (v :: vs) b
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 11573
    | strip vs tm = (List.rev vs, tm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11574
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11575
  val stripForall = strip [];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11576
end;
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
(* Existential quantifiers *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11579
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11580
fun destExists (Exists v_f) = v_f
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11581
  | destExists _ = raise Error "destExists";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11582
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11583
val isExists = can destExists;
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
fun listMkExists ([],body) = body
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11586
  | listMkExists (v :: vs, body) = Exists (v, listMkExists (vs,body));
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11587
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11588
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
 11589
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11590
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11591
  fun strip vs (Exists (v,b)) = strip (v :: vs) b
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 11592
    | strip vs tm = (List.rev vs, tm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11593
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11594
  val stripExists = strip [];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11595
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11596
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
(* The size of a formula in symbols.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11599
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11600
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11601
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11602
  fun sz n [] = n
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11603
    | sz n (True :: fms) = sz (n + 1) fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11604
    | sz n (False :: fms) = sz (n + 1) fms
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11605
    | 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
 11606
    | sz n (Not p :: fms) = sz (n + 1) (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11607
    | 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
 11608
    | 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
 11609
    | 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
 11610
    | 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
 11611
    | sz n (Forall (_,p) :: fms) = sz (n + 1) (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11612
    | sz n (Exists (_,p) :: fms) = sz (n + 1) (p :: fms);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11613
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11614
  fun symbols fm = sz 0 [fm];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11615
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11616
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11617
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11618
(* A total comparison function for formulas.                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11619
(* ------------------------------------------------------------------------- *)
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
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11622
  fun cmp [] = EQUAL
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11623
    | cmp (f1_f2 :: fs) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11624
      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
 11625
      else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11626
        case f1_f2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11627
          (True,True) => cmp fs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11628
        | (True,_) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11629
        | (_,True) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11630
        | (False,False) => cmp fs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11631
        | (False,_) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11632
        | (_,False) => GREATER
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11633
        | (Metis_Atom atm1, Metis_Atom atm2) =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11634
          (case Metis_Atom.compare (atm1,atm2) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11635
             LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11636
           | EQUAL => cmp fs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11637
           | GREATER => GREATER)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11638
        | (Metis_Atom _, _) => LESS
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11639
        | (_, Metis_Atom _) => GREATER
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11640
        | (Not p1, Not p2) => cmp ((p1,p2) :: fs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11641
        | (Not _, _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11642
        | (_, Not _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11643
        | (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
 11644
        | (And _, _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11645
        | (_, And _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11646
        | (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
 11647
        | (Or _, _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11648
        | (_, Or _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11649
        | (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
 11650
        | (Imp _, _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11651
        | (_, Imp _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11652
        | (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
 11653
        | (Iff _, _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11654
        | (_, Iff _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11655
        | (Forall (v1,p1), Forall (v2,p2)) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11656
          (case Metis_Name.compare (v1,v2) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11657
             LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11658
           | EQUAL => cmp ((p1,p2) :: fs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11659
           | GREATER => GREATER)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11660
        | (Forall _, Exists _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11661
        | (Exists _, Forall _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11662
        | (Exists (v1,p1), Exists (v2,p2)) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11663
          (case Metis_Name.compare (v1,v2) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11664
             LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11665
           | EQUAL => cmp ((p1,p2) :: fs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11666
           | GREATER => GREATER);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11667
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11668
  fun compare fm1_fm2 = cmp [fm1_fm2];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11669
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11670
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11671
fun equal fm1 fm2 = compare (fm1,fm2) = EQUAL;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11672
23442
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
(* Free variables.                                                           *)
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 freeIn v =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11678
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11679
      fun f [] = false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11680
        | f (True :: fms) = f fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11681
        | f (False :: fms) = f fms
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11682
        | 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
 11683
        | f (Not p :: fms) = f (p :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11684
        | f (And (p,q) :: fms) = f (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11685
        | f (Or (p,q) :: fms) = f (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11686
        | f (Imp (p,q) :: fms) = f (p :: q :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11687
        | 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
 11688
        | f (Forall (w,p) :: fms) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11689
          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
 11690
        | f (Exists (w,p) :: fms) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11691
          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
 11692
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11693
      fn fm => f [fm]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11694
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11695
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11696
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11697
  fun fv vs [] = vs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11698
    | fv vs ((_,True) :: fms) = fv vs fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11699
    | fv vs ((_,False) :: fms) = fv vs fms
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11700
    | fv vs ((bv, Metis_Atom atm) :: fms) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11701
      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
 11702
    | fv vs ((bv, Not p) :: fms) = fv vs ((bv,p) :: fms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11703
    | 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
 11704
    | 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
 11705
    | 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
 11706
    | 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
 11707
    | 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
 11708
    | 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
 11709
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11710
  fun add (fm,vs) = fv vs [(Metis_NameSet.empty,fm)];
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11711
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11712
  fun freeVars fm = add (fm,Metis_NameSet.empty);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11713
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11714
  fun freeVarsList fms = List.foldl add Metis_NameSet.empty fms;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11715
end;
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
fun specialize fm = snd (stripForall fm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11718
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11719
fun generalize fm = listMkForall (Metis_NameSet.toList (freeVars fm), fm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11720
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11721
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11722
(* Substitutions.                                                            *)
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11725
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11726
  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
 11727
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11728
  and substFm sub fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11729
      case fm of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11730
        True => fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11731
      | False => fm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11732
      | Metis_Atom (p,tms) =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11733
        let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11734
          val tms' = Metis_Sharing.map (Metis_Subst.subst sub) tms
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11735
        in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11736
          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
 11737
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11738
      | Not p =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11739
        let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11740
          val p' = substFm sub p
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11741
        in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11742
          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
 11743
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11744
      | And (p,q) => substConn sub fm And p q
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11745
      | Or (p,q) => substConn sub fm Or p q
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11746
      | Imp (p,q) => substConn sub fm Imp p q
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11747
      | Iff (p,q) => substConn sub fm Iff p q
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11748
      | Forall (v,p) => substQuant sub fm Forall v p
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11749
      | Exists (v,p) => substQuant sub fm Exists v p
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11750
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11751
  and substConn sub fm conn p q =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11752
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11753
        val p' = substFm sub p
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11754
        and q' = substFm sub q
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11755
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11756
        if Metis_Portable.pointerEqual (p,p') andalso
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11757
           Metis_Portable.pointerEqual (q,q')
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11758
        then fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11759
        else conn (p',q')
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11760
      end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11761
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11762
  and substQuant sub fm quant v p =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11763
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11764
        val v' =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11765
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11766
              fun f (w,s) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11767
                  if Metis_Name.equal w v then s
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11768
                  else
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11769
                    case Metis_Subst.peek sub w of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11770
                      NONE => Metis_NameSet.add s w
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11771
                    | 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
 11772
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11773
              val vars = freeVars p
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11774
              val vars = Metis_NameSet.foldl f Metis_NameSet.empty vars
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11775
            in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11776
              Metis_Term.variantPrime vars v
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11777
            end
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
        val sub =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11780
            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
 11781
            else Metis_Subst.insert sub (v, Metis_Term.Var v')
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11782
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11783
        val p' = substCheck sub p
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11784
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11785
        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
 11786
        else quant (v',p')
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11787
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11788
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11789
  val subst = substCheck;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11790
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11791
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11792
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11793
(* The equality relation.                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11794
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11795
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11796
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
 11797
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11798
fun destEq fm = Metis_Atom.destEq (destAtom fm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11799
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11800
val isEq = can destEq;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11801
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11802
fun mkNeq a_b = Not (mkEq a_b);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11803
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11804
fun destNeq (Not fm) = destEq fm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11805
  | destNeq _ = raise Error "Metis_Formula.destNeq";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11806
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11807
val isNeq = can destNeq;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11808
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11809
fun mkRefl tm = Metis_Atom (Metis_Atom.mkRefl tm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11810
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11811
fun destRefl fm = Metis_Atom.destRefl (destAtom fm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11812
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11813
val isRefl = can destRefl;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11814
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11815
fun sym fm = Metis_Atom (Metis_Atom.sym (destAtom fm));
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
fun lhs fm = fst (destEq fm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11818
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11819
fun rhs fm = snd (destEq fm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11820
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11821
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11822
(* Parsing and pretty-printing.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11823
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11824
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11825
type quotation = formula Metis_Parse.quotation;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11826
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11827
val truthName = Metis_Name.fromString "T"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11828
and falsityName = Metis_Name.fromString "F"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11829
and conjunctionName = Metis_Name.fromString "/\\"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11830
and disjunctionName = Metis_Name.fromString "\\/"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11831
and implicationName = Metis_Name.fromString "==>"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11832
and equivalenceName = Metis_Name.fromString "<=>"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11833
and universalName = Metis_Name.fromString "!"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11834
and existentialName = Metis_Name.fromString "?";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11835
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11836
local
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11837
  fun demote True = Metis_Term.Fn (truthName,[])
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11838
    | demote False = Metis_Term.Fn (falsityName,[])
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11839
    | 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
 11840
    | demote (Not p) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11841
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11842
        val Unsynchronized.ref s = Metis_Term.negation
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11843
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11844
        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
 11845
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11846
    | 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
 11847
    | 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
 11848
    | 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
 11849
    | 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
 11850
    | 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
 11851
    | demote (Exists (v,b)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11852
      Metis_Term.Fn (existentialName, [Metis_Term.Var v, demote b]);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11853
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11854
  fun pp fm = Metis_Term.pp (demote fm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11855
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11856
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11857
val toString = Metis_Print.toString pp;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11858
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11859
local
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11860
  fun isQuant [Metis_Term.Var _, _] = true
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11861
    | isQuant _ = false;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11862
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11863
  fun promote (Metis_Term.Var v) = Metis_Atom (v,[])
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11864
    | promote (Metis_Term.Fn (f,tms)) =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 11865
      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
 11866
        True
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 11867
      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
 11868
        False
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11869
      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
 11870
        Not (promote (hd tms))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11871
      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
 11872
        And (promote (hd tms), promote (List.nth (tms,1)))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11873
      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
 11874
        Or (promote (hd tms), promote (List.nth (tms,1)))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11875
      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
 11876
        Imp (promote (hd tms), promote (List.nth (tms,1)))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11877
      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
 11878
        Iff (promote (hd tms), promote (List.nth (tms,1)))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11879
      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
 11880
        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
 11881
      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
 11882
        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
 11883
      else
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11884
        Metis_Atom (f,tms);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11885
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11886
  fun fromString s = promote (Metis_Term.fromString s);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11887
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11888
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11889
val parse = Metis_Parse.parseQuotation toString fromString;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11890
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11891
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11892
(* Splitting goals.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11893
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11894
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11895
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11896
  fun add_asms asms goal =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 11897
      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
 11898
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11899
  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
 11900
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11901
  fun split asms pol fm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11902
      case (pol,fm) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11903
        (* Positive splittables *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11904
        (true,True) => []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11905
      | (true, Not f) => split asms false f
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11906
      | (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
 11907
      | (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
 11908
      | (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
 11909
      | (true, Iff (f1,f2)) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11910
        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
 11911
      | (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
 11912
        (* Negative splittables *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11913
      | (false,False) => []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11914
      | (false, Not f) => split asms true f
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11915
      | (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
 11916
      | (false, Or (f1,f2)) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11917
        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
 11918
      | (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
 11919
      | (false, Iff (f1,f2)) =>
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 11920
        split (f1 :: asms) false f2 @ split (Not f2 :: asms) true f1
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 11921
      | (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
 11922
        (* Unsplittables *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11923
      | _ => [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
 11924
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11925
  fun splitGoal fm = split [] true fm;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11926
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11927
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11928
(*MetisTrace3
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11929
val splitGoal = fn fm =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11930
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11931
      val result = splitGoal fm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11932
      val () = Metis_Print.trace pp "Metis_Formula.splitGoal: fm" fm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11933
      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
 11934
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11935
      result
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11936
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11937
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11938
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11939
end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 11940
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11941
structure Metis_FormulaOrdered =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11942
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
 11943
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11944
structure Metis_FormulaMap = Metis_KeyMap (Metis_FormulaOrdered);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11945
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11946
structure Metis_FormulaSet = Metis_ElementSet (Metis_FormulaMap);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11947
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 11948
(**** Original file: src/Literal.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11949
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
(* FIRST ORDER LOGIC LITERALS                                                *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 11952
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11953
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11954
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11955
signature Metis_Literal =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11956
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11957
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
(* A type for storing first order logic literals.                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11960
(* ------------------------------------------------------------------------- *)
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
type polarity = bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11963
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11964
type literal = polarity * Metis_Atom.atom
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11965
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11966
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11967
(* Constructors and destructors.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11968
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11969
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11970
val polarity : literal -> polarity
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11971
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11972
val atom : literal -> Metis_Atom.atom
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11973
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11974
val name : literal -> Metis_Atom.relationName
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11975
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11976
val arguments : literal -> Metis_Term.term list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11977
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11978
val arity : literal -> int
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
val positive : literal -> bool
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 negative : literal -> bool
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 negate : literal -> literal
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11985
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11986
val relation : literal -> Metis_Atom.relation
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11987
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11988
val functions : literal -> Metis_NameAritySet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11989
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11990
val functionNames : literal -> Metis_NameSet.set
23442
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
(* Binary relations *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 11993
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11994
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
 11995
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11996
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
 11997
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 11998
val isBinop : Metis_Atom.relationName -> literal -> bool
23442
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
(* Formulas *)
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 toFormula : literal -> Metis_Formula.formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12003
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12004
val fromFormula : Metis_Formula.formula -> literal
23442
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12007
(* The size of a literal in symbols.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12008
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12009
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12010
val symbols : literal -> int
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 comparison function for literals.                                 *)
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 : literal * literal -> order  (* negative < positive *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12017
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12018
val equal : literal -> literal -> bool
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12019
23442
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
(* Subterms.                                                                 *)
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 subterm : literal -> Metis_Term.path -> Metis_Term.term
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 subterms : literal -> (Metis_Term.path * Metis_Term.term) list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12027
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12028
val replace : literal -> Metis_Term.path * Metis_Term.term -> literal
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12029
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
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12032
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12033
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12034
val freeIn : Metis_Term.var -> literal -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12035
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12036
val freeVars : literal -> Metis_NameSet.set
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12039
(* Substitutions.                                                            *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12042
val subst : Metis_Subst.subst -> literal -> literal
23442
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
(* Matching.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12046
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12047
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12048
val match :  (* raises Error *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12049
    Metis_Subst.subst -> literal -> literal -> Metis_Subst.subst
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12050
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
(* Unification.                                                              *)
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12055
val unify :  (* raises Error *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12056
    Metis_Subst.subst -> literal -> literal -> Metis_Subst.subst
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12057
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12058
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12059
(* The equality relation.                                                    *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12062
val mkEq : Metis_Term.term * Metis_Term.term -> literal
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12063
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12064
val destEq : literal -> Metis_Term.term * Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12065
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12066
val isEq : literal -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12067
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12068
val mkNeq : Metis_Term.term * Metis_Term.term -> literal
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12069
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12070
val destNeq : literal -> Metis_Term.term * Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12071
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12072
val isNeq : literal -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12073
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12074
val mkRefl : Metis_Term.term -> literal
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12075
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12076
val destRefl : literal -> Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12077
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12078
val isRefl : literal -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12079
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12080
val mkIrrefl : Metis_Term.term -> literal
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12081
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12082
val destIrrefl : literal -> Metis_Term.term
23442
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
val isIrrefl : literal -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12085
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12086
(* The following work with both equalities and disequalities *)
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
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
 12089
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12090
val lhs : literal -> Metis_Term.term
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12091
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12092
val rhs : literal -> Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12093
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
(* Special support for terms with type annotations.                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12096
(* ------------------------------------------------------------------------- *)
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
val typedSymbols : literal -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12099
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12100
val nonVarTypedSubterms : literal -> (Metis_Term.path * Metis_Term.term) list
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12103
(* Parsing and pretty-printing.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12104
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12105
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12106
val pp : literal Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12107
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12108
val toString : literal -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12109
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12110
val fromString : string -> literal
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12111
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12112
val parse : Metis_Term.term Metis_Parse.quotation -> literal
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12113
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12114
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12115
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12116
(**** Original file: src/Literal.sml ****)
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
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12119
(* FIRST ORDER LOGIC LITERALS                                                *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 12120
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12121
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12122
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12123
structure Metis_Literal :> Metis_Literal =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12124
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12125
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12126
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12127
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
(* A type for storing first order logic literals.                            *)
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
type polarity = bool;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12133
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12134
type literal = polarity * Metis_Atom.atom;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12135
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12136
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12137
(* Constructors and destructors.                                             *)
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12140
fun polarity ((pol,_) : literal) = pol;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12141
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12142
fun atom ((_,atm) : literal) = atm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12143
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12144
fun name lit = Metis_Atom.name (atom lit);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12145
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12146
fun arguments lit = Metis_Atom.arguments (atom lit);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12147
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12148
fun arity lit = Metis_Atom.arity (atom lit);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12149
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12150
fun positive lit = polarity lit;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12151
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12152
fun negative lit = not (polarity lit);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12153
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12154
fun negate (pol,atm) : literal = (not pol, atm)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12155
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12156
fun relation lit = Metis_Atom.relation (atom lit);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12157
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12158
fun functions lit = Metis_Atom.functions (atom lit);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12159
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12160
fun functionNames lit = Metis_Atom.functionNames (atom lit);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12161
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12162
(* Binary relations *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12163
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12164
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
 12165
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12166
fun destBinop rel ((pol,atm) : literal) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12167
    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
 12168
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12169
fun isBinop rel = can (destBinop rel);
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
(* Formulas *)
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 toFormula (true,atm) = Metis_Formula.Metis_Atom atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12174
  | 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
 12175
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12176
fun fromFormula (Metis_Formula.Metis_Atom atm) = (true,atm)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12177
  | 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
 12178
  | fromFormula _ = raise Error "Metis_Literal.fromFormula";
23442
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12181
(* The size of a literal in symbols.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12182
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12183
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12184
fun symbols ((_,atm) : literal) = Metis_Atom.symbols atm;
23442
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12187
(* A total comparison function for literals.                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12188
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12189
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12190
val compare = prodCompare boolCompare Metis_Atom.compare;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12191
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12192
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
 12193
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12194
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12195
(* Subterms.                                                                 *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12198
fun subterm lit path = Metis_Atom.subterm (atom lit) path;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12199
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12200
fun subterms lit = Metis_Atom.subterms (atom lit);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12201
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12202
fun replace (lit as (pol,atm)) path_tm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12203
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12204
      val atm' = Metis_Atom.replace atm path_tm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12205
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12206
      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
 12207
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12208
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12209
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12210
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12211
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12212
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12213
fun freeIn v lit = Metis_Atom.freeIn v (atom lit);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12214
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12215
fun freeVars lit = Metis_Atom.freeVars (atom lit);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12216
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12217
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12218
(* Substitutions.                                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12219
(* ------------------------------------------------------------------------- *)
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
fun subst sub (lit as (pol,atm)) : literal =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12222
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12223
      val atm' = Metis_Atom.subst sub atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12224
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12225
      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
 12226
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12227
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12228
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12229
(* Matching.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12230
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12231
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12232
fun match sub ((pol1,atm1) : literal) (pol2,atm2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12233
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12234
      val _ = pol1 = pol2 orelse raise Error "Metis_Literal.match"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12235
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12236
      Metis_Atom.match sub atm1 atm2
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12237
    end;
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12240
(* Unification.                                                              *)
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
fun unify sub ((pol1,atm1) : literal) (pol2,atm2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12244
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12245
      val _ = pol1 = pol2 orelse raise Error "Metis_Literal.unify"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12246
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12247
      Metis_Atom.unify sub atm1 atm2
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12248
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12249
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12250
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12251
(* The equality relation.                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12252
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12253
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12254
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
 12255
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12256
fun destEq ((true,atm) : literal) = Metis_Atom.destEq atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12257
  | destEq (false,_) = raise Error "Metis_Literal.destEq";
23442
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
val isEq = can destEq;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12260
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12261
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
 12262
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12263
fun destNeq ((false,atm) : literal) = Metis_Atom.destEq atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12264
  | destNeq (true,_) = raise Error "Metis_Literal.destNeq";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12265
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12266
val isNeq = can destNeq;
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 mkRefl tm = (true, Metis_Atom.mkRefl tm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12269
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12270
fun destRefl (true,atm) = Metis_Atom.destRefl atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12271
  | destRefl (false,_) = raise Error "Metis_Literal.destRefl";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12272
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12273
val isRefl = can destRefl;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12274
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12275
fun mkIrrefl tm = (false, Metis_Atom.mkRefl tm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12276
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12277
fun destIrrefl (true,_) = raise Error "Metis_Literal.destIrrefl"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12278
  | destIrrefl (false,atm) = Metis_Atom.destRefl atm;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12279
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12280
val isIrrefl = can destIrrefl;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12281
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12282
fun sym (pol,atm) : literal = (pol, Metis_Atom.sym atm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12283
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12284
fun lhs ((_,atm) : literal) = Metis_Atom.lhs atm;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12285
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12286
fun rhs ((_,atm) : literal) = Metis_Atom.rhs atm;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12287
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12288
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12289
(* Special support for terms with type annotations.                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12290
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12291
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12292
fun typedSymbols ((_,atm) : literal) = Metis_Atom.typedSymbols atm;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12293
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12294
fun nonVarTypedSubterms ((_,atm) : literal) = Metis_Atom.nonVarTypedSubterms atm;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12295
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12296
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12297
(* Parsing and pretty-printing.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12298
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12299
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12300
val pp = Metis_Print.ppMap toFormula Metis_Formula.pp;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12301
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12302
val toString = Metis_Print.toString pp;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12303
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12304
fun fromString s = fromFormula (Metis_Formula.fromString s);
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 parse = Metis_Parse.parseQuotation Metis_Term.toString fromString;
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
end
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
structure Metis_LiteralOrdered =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12311
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
 12312
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12313
structure Metis_LiteralMap = Metis_KeyMap (Metis_LiteralOrdered);
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
structure Metis_LiteralSet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12316
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12317
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12318
  local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12319
    structure S = Metis_ElementSet (Metis_LiteralMap);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12320
  in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12321
    open S;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12322
  end;
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
  fun negateMember lit set = member (Metis_Literal.negate lit) set;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12325
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12326
  val negate =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12327
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12328
        fun f (lit,set) = add set (Metis_Literal.negate lit)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12329
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12330
        foldl f empty
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12331
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12332
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12333
  val relations =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12334
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12335
        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
 12336
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12337
        foldl f Metis_NameAritySet.empty
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12338
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12339
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12340
  val functions =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12341
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12342
        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
 12343
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12344
        foldl f Metis_NameAritySet.empty
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12345
      end;
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
  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
 12348
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12349
  val freeVars =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12350
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12351
        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
 12352
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12353
        foldl f Metis_NameSet.empty
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12354
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12355
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12356
  val freeVarsList =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12357
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12358
        fun f (lits,set) = Metis_NameSet.union set (freeVars lits)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12359
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12360
        List.foldl f Metis_NameSet.empty
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12361
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12362
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12363
  val symbols =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12364
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12365
        fun f (lit,z) = Metis_Literal.symbols lit + z
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12366
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12367
        foldl f 0
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12368
      end;
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
  val typedSymbols =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12371
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12372
        fun f (lit,z) = Metis_Literal.typedSymbols lit + z
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12373
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12374
        foldl f 0
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12375
      end;
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
  fun subst sub lits =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12378
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12379
        fun substLit (lit,(eq,lits')) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12380
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12381
              val lit' = Metis_Literal.subst sub lit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12382
              val eq = eq andalso Metis_Portable.pointerEqual (lit,lit')
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12383
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12384
              (eq, add lits' lit')
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12385
            end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12386
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12387
        val (eq,lits') = foldl substLit (true,empty) lits
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12388
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12389
        if eq then lits else lits'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12390
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12391
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12392
  fun conjoin set =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12393
      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
 12394
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12395
  fun disjoin set =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12396
      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
 12397
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12398
  val pp =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12399
      Metis_Print.ppMap
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12400
        toList
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12401
        (Metis_Print.ppBracket "{" "}" (Metis_Print.ppOpList "," Metis_Literal.pp));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12402
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12403
end
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
structure Metis_LiteralSetOrdered =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12406
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
 12407
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12408
structure Metis_LiteralSetMap = Metis_KeyMap (Metis_LiteralSetOrdered);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12409
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12410
structure Metis_LiteralSetSet = Metis_ElementSet (Metis_LiteralSetMap);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12411
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12412
(**** Original file: src/Thm.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12413
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12414
(* ========================================================================= *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12415
(* A LOGICAL KERNEL FOR FIRST ORDER CLAUSAL THEOREMS                         *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 12416
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12417
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12418
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12419
signature Metis_Thm =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12420
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12421
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12422
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12423
(* An abstract type of first order logic theorems.                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12424
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12425
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12426
type thm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12427
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12428
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12429
(* Theorem destructors.                                                      *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12432
type clause = Metis_LiteralSet.set
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12433
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12434
datatype inferenceType =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12435
    Axiom
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12436
  | Assume
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12437
  | Metis_Subst
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12438
  | Factor
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12439
  | Resolve
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12440
  | Refl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12441
  | Equality
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12443
type inference = inferenceType * thm list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12444
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12445
val clause : thm -> clause
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12446
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12447
val inference : thm -> inference
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12448
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12449
(* Tautologies *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12450
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12451
val isTautology : thm -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12452
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12453
(* Contradictions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12454
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12455
val isContradiction : thm -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12456
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12457
(* Unit theorems *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12458
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12459
val destUnit : thm -> Metis_Literal.literal
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12460
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12461
val isUnit : thm -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12462
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12463
(* Unit equality theorems *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12464
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12465
val destUnitEq : thm -> Metis_Term.term * Metis_Term.term
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12466
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12467
val isUnitEq : thm -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12468
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12469
(* Literals *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12470
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12471
val member : Metis_Literal.literal -> thm -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12472
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12473
val negateMember : Metis_Literal.literal -> thm -> bool
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12474
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12475
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12476
(* A total order.                                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12477
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12478
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12479
val compare : thm * thm -> order
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12480
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12481
val equal : thm -> thm -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12482
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12483
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12484
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12485
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12486
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12487
val freeIn : Metis_Term.var -> thm -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12488
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12489
val freeVars : thm -> Metis_NameSet.set
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12490
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12491
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12492
(* Pretty-printing.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12493
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12494
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12495
val ppInferenceType : inferenceType Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12496
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12497
val inferenceTypeToString : inferenceType -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12498
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12499
val pp : thm Metis_Print.pp
23442
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
val toString : thm -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12502
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12503
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12504
(* Primitive rules of inference.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12505
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12506
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12507
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12508
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12509
(* ----- axiom C                                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12510
(*   C                                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12511
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12512
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12513
val axiom : clause -> thm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12514
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12515
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12516
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12517
(* ----------- assume L                                                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12518
(*   L \/ ~L                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12519
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12520
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12521
val assume : Metis_Literal.literal -> thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12522
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12523
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12524
(*    C                                                                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12525
(* -------- subst s                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12526
(*   C[s]                                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12527
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12528
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12529
val subst : Metis_Subst.subst -> thm -> thm
23442
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12532
(*   L \/ C    ~L \/ D                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12533
(* --------------------- resolve L                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12534
(*        C \/ D                                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12535
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12536
(* 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
 12537
(* occur in the second theorem.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12538
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12539
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12540
val resolve : Metis_Literal.literal -> thm -> thm -> thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12541
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12542
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12543
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12544
(* --------- refl t                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12545
(*   t = t                                                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12546
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12547
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12548
val refl : Metis_Term.term -> thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12549
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12550
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12551
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12552
(* ------------------------ equality L p t                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12553
(*   ~(s = t) \/ ~L \/ L'                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12554
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12555
(* 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
 12556
(* path p being replaced by t.                                               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12557
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12558
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12559
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
 12560
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12561
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12562
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12563
(**** Original file: src/Thm.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12564
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12565
(* ========================================================================= *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12566
(* A LOGICAL KERNEL FOR FIRST ORDER CLAUSAL THEOREMS                         *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 12567
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12568
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12569
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12570
structure Metis_Thm :> Metis_Thm =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12571
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12572
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12573
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12574
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12575
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12576
(* An abstract type of first order logic theorems.                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12577
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12578
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12579
type clause = Metis_LiteralSet.set;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12580
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12581
datatype inferenceType =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12582
    Axiom
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12583
  | Assume
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12584
  | Metis_Subst
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12585
  | Factor
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12586
  | Resolve
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12587
  | Refl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12588
  | Equality;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12589
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12590
datatype thm = Metis_Thm of clause * (inferenceType * thm list);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12591
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12592
type inference = inferenceType * thm list;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12593
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12594
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12595
(* Theorem destructors.                                                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12596
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12597
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12598
fun clause (Metis_Thm (cl,_)) = cl;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12599
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12600
fun inference (Metis_Thm (_,inf)) = inf;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12601
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12602
(* Tautologies *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12603
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12604
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12605
  fun chk (_,NONE) = NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12606
    | chk ((pol,atm), SOME set) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12607
      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
 12608
      else SOME (Metis_AtomSet.add set atm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12609
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12610
  fun isTautology th =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12611
      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
 12612
        SOME _ => false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12613
      | NONE => true;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12614
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12615
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12616
(* Contradictions *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12617
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12618
fun isContradiction th = Metis_LiteralSet.null (clause th);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12619
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12620
(* Unit theorems *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12621
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12622
fun destUnit (Metis_Thm (cl,_)) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12623
    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
 12624
    else raise Error "Metis_Thm.destUnit";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12625
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12626
val isUnit = can destUnit;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12627
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12628
(* Unit equality theorems *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12629
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12630
fun destUnitEq th = Metis_Literal.destEq (destUnit th);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12631
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12632
val isUnitEq = can destUnitEq;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12633
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12634
(* Literals *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12635
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12636
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
 12637
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12638
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
 12639
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12640
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12641
(* A total order.                                                            *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12644
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
 12645
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12646
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
 12647
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12648
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12649
(* Free variables.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12650
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12651
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12652
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
 12653
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12654
fun freeVars (Metis_Thm (cl,_)) = Metis_LiteralSet.freeVars cl;
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12657
(* Pretty-printing.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12658
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12659
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12660
fun inferenceTypeToString Axiom = "Axiom"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12661
  | inferenceTypeToString Assume = "Assume"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12662
  | inferenceTypeToString Metis_Subst = "Metis_Subst"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12663
  | inferenceTypeToString Factor = "Factor"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12664
  | inferenceTypeToString Resolve = "Resolve"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12665
  | inferenceTypeToString Refl = "Refl"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12666
  | inferenceTypeToString Equality = "Equality";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12667
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12668
fun ppInferenceType inf =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12669
    Metis_Print.ppString (inferenceTypeToString inf);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12670
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12671
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12672
  fun toFormula th =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12673
      Metis_Formula.listMkDisj
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 12674
        (List.map Metis_Literal.toFormula (Metis_LiteralSet.toList (clause th)));
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12675
in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12676
  fun pp th =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12677
      Metis_Print.inconsistentBlock 3
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12678
        [Metis_Print.ppString "|- ",
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12679
         Metis_Formula.pp (toFormula th)];
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12680
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12681
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12682
val toString = Metis_Print.toString pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12683
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12684
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12685
(* Primitive rules of inference.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12686
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12687
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12688
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12689
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12690
(* ----- axiom C                                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12691
(*   C                                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12692
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12693
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12694
fun axiom cl = Metis_Thm (cl,(Axiom,[]));
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12695
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12696
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12697
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12698
(* ----------- assume L                                                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12699
(*   L \/ ~L                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12700
(* ------------------------------------------------------------------------- *)
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
fun assume lit =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12703
    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
 12704
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12705
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12706
(*    C                                                                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12707
(* -------- subst s                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12708
(*   C[s]                                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12709
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12710
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12711
fun subst sub (th as Metis_Thm (cl,inf)) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12712
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12713
      val cl' = Metis_LiteralSet.subst sub cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12714
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12715
      if Metis_Portable.pointerEqual (cl,cl') then th
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12716
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12717
        case inf of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12718
          (Metis_Subst,_) => Metis_Thm (cl',inf)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12719
        | _ => Metis_Thm (cl',(Metis_Subst,[th]))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12720
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12721
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
(*   L \/ C    ~L \/ D                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12724
(* --------------------- resolve L                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12725
(*        C \/ D                                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12726
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12727
(* 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
 12728
(* occur in the second theorem.                                              *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12731
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
 12732
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12733
      val cl1' = Metis_LiteralSet.delete cl1 lit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12734
      and cl2' = Metis_LiteralSet.delete cl2 (Metis_Literal.negate lit)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12735
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12736
      Metis_Thm (Metis_LiteralSet.union cl1' cl2', (Resolve,[th1,th2]))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12737
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12738
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12739
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12740
val resolve = fn lit => fn pos => fn neg =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12741
    resolve lit pos neg
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12742
    handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12743
      raise Error ("Metis_Thm.resolve:\nlit = " ^ Metis_Literal.toString lit ^
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12744
                   "\npos = " ^ toString pos ^
74358
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 12745
                   "\nneg = " ^ toString neg ^ "\n" ^ err)
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 12746
         | Bug bug =>
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 12747
      raise Bug ("Metis_Thm.resolve:\nlit = " ^ Metis_Literal.toString lit ^
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 12748
                 "\npos = " ^ toString pos ^
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 12749
                 "\nneg = " ^ toString neg ^ "\n" ^ bug);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12750
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12751
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12752
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12753
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12754
(* --------- refl t                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12755
(*   t = t                                                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12756
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12757
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12758
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
 12759
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12760
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12761
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12762
(* ------------------------ equality L p t                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12763
(*   ~(s = t) \/ ~L \/ L'                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12764
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12765
(* 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
 12766
(* path p being replaced by t.                                               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12767
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12768
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12769
fun equality lit path t =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12770
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12771
      val s = Metis_Literal.subterm lit path
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12772
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12773
      val lit' = Metis_Literal.replace lit (path,t)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12774
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12775
      val eqLit = Metis_Literal.mkNeq (s,t)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12776
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12777
      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
 12778
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12779
      Metis_Thm (cl,(Equality,[]))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12780
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12781
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12782
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12783
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12784
(**** Original file: src/Proof.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12785
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12786
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12787
(* PROOFS IN FIRST ORDER LOGIC                                               *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 12788
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12789
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12790
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12791
signature Metis_Proof =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12792
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12793
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12794
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12795
(* A type of first order logic proofs.                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12796
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12797
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12798
datatype inference =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12799
    Axiom of Metis_LiteralSet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12800
  | Assume of Metis_Atom.atom
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12801
  | Metis_Subst of Metis_Subst.subst * Metis_Thm.thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12802
  | 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
 12803
  | Refl of Metis_Term.term
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12804
  | 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
 12805
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12806
type proof = (Metis_Thm.thm * inference) list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12807
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12808
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12809
(* Reconstructing single inferences.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12810
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12811
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12812
val inferenceType : inference -> Metis_Thm.inferenceType
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12813
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12814
val parents : inference -> Metis_Thm.thm list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12815
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12816
val inferenceToThm : inference -> Metis_Thm.thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12817
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12818
val thmToInference : Metis_Thm.thm -> inference
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12819
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12820
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12821
(* Reconstructing whole proofs.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12822
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12823
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12824
val proof : Metis_Thm.thm -> proof
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12825
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12826
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12827
(* Free variables.                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12828
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12829
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12830
val freeIn : Metis_Term.var -> proof -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12831
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12832
val freeVars : proof -> Metis_NameSet.set
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12833
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12834
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12835
(* Printing.                                                                 *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12838
val ppInference : inference Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12839
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12840
val inferenceToString : inference -> string
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
val pp : proof Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12843
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12844
val toString : proof -> string
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
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12847
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12848
(**** Original file: src/Proof.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12849
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12850
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12851
(* PROOFS IN FIRST ORDER LOGIC                                               *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 12852
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12855
structure Metis_Proof :> Metis_Proof =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12856
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12857
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12858
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12859
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
(* A type of first order logic proofs.                                       *)
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12864
datatype inference =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12865
    Axiom of Metis_LiteralSet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12866
  | Assume of Metis_Atom.atom
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12867
  | Metis_Subst of Metis_Subst.subst * Metis_Thm.thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12868
  | 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
 12869
  | Refl of Metis_Term.term
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12870
  | 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
 12871
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12872
type proof = (Metis_Thm.thm * inference) list;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12873
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
(* Printing.                                                                 *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12878
fun inferenceType (Axiom _) = Metis_Thm.Axiom
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12879
  | inferenceType (Assume _) = Metis_Thm.Assume
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12880
  | inferenceType (Metis_Subst _) = Metis_Thm.Metis_Subst
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12881
  | inferenceType (Resolve _) = Metis_Thm.Resolve
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12882
  | inferenceType (Refl _) = Metis_Thm.Refl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12883
  | inferenceType (Equality _) = Metis_Thm.Equality;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12884
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12885
local
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12886
  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
 12887
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12888
  fun ppSubst ppThm (sub,thm) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12889
      Metis_Print.sequence Metis_Print.break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12890
        (Metis_Print.inconsistentBlock 1
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12891
           [Metis_Print.ppString "{",
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12892
            Metis_Print.ppOp2 " =" Metis_Print.ppString Metis_Subst.pp ("sub",sub),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12893
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12894
            Metis_Print.break,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12895
            Metis_Print.ppOp2 " =" Metis_Print.ppString ppThm ("thm",thm),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12896
            Metis_Print.ppString "}"]);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12897
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12898
  fun ppResolve ppThm (res,pos,neg) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12899
      Metis_Print.sequence Metis_Print.break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12900
        (Metis_Print.inconsistentBlock 1
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12901
           [Metis_Print.ppString "{",
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12902
            Metis_Print.ppOp2 " =" Metis_Print.ppString Metis_Atom.pp ("res",res),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12903
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12904
            Metis_Print.break,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12905
            Metis_Print.ppOp2 " =" Metis_Print.ppString ppThm ("pos",pos),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12906
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12907
            Metis_Print.break,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12908
            Metis_Print.ppOp2 " =" Metis_Print.ppString ppThm ("neg",neg),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12909
            Metis_Print.ppString "}"]);
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12910
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12911
  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
 12912
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12913
  fun ppEquality (lit,path,res) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12914
      Metis_Print.sequence Metis_Print.break
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12915
        (Metis_Print.inconsistentBlock 1
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12916
           [Metis_Print.ppString "{",
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12917
            Metis_Print.ppOp2 " =" Metis_Print.ppString Metis_Literal.pp ("lit",lit),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12918
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12919
            Metis_Print.break,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12920
            Metis_Print.ppOp2 " =" Metis_Print.ppString Metis_Term.ppPath ("path",path),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12921
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12922
            Metis_Print.break,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12923
            Metis_Print.ppOp2 " =" Metis_Print.ppString Metis_Term.pp ("res",res),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12924
            Metis_Print.ppString "}"]);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12925
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12926
  fun ppInf ppAxiom ppThm inf =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12927
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12928
        val infString = Metis_Thm.inferenceTypeToString (inferenceType inf)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12929
      in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12930
        Metis_Print.inconsistentBlock 2
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12931
          [Metis_Print.ppString infString,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12932
           (case inf of
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12933
              Axiom cl => ppAxiom cl
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12934
            | Assume x => ppAssume x
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12935
            | Metis_Subst x => ppSubst ppThm x
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12936
            | Resolve x => ppResolve ppThm x
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12937
            | Refl x => ppRefl x
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12938
            | Equality x => ppEquality x)]
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12939
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12940
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12941
  fun ppAxiom cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12942
      Metis_Print.sequence
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12943
        Metis_Print.break
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12944
        (Metis_Print.ppMap
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12945
           Metis_LiteralSet.toList
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12946
           (Metis_Print.ppBracket "{" "}" (Metis_Print.ppOpList "," Metis_Literal.pp)) cl);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12947
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12948
  val ppInference = ppInf ppAxiom Metis_Thm.pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12949
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12950
  fun pp prf =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12951
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12952
        fun thmString n = "(" ^ Int.toString n ^ ")"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12953
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12954
        val prf = enumerate prf
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12955
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12956
        fun ppThm th =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12957
            Metis_Print.ppString
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12958
            let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12959
              val cl = Metis_Thm.clause th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12960
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12961
              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
 12962
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12963
              case List.find pred prf of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12964
                NONE => "(?)"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12965
              | SOME (n,_) => thmString n
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12966
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12967
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12968
        fun ppStep (n,(th,inf)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12969
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12970
              val s = thmString n
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12971
            in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12972
              Metis_Print.sequence
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12973
                (Metis_Print.consistentBlock (1 + size s)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12974
                   [Metis_Print.ppString (s ^ " "),
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12975
                    Metis_Thm.pp th,
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12976
                    Metis_Print.breaks 2,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12977
                    Metis_Print.ppBracket "[" "]" (ppInf (K Metis_Print.skip) ppThm) inf])
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12978
                Metis_Print.newline
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12979
            end
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12980
      in
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12981
        Metis_Print.consistentBlock 0
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12982
          [Metis_Print.ppString "START OF PROOF",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 12983
           Metis_Print.newline,
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 12984
           Metis_Print.program (List.map ppStep prf),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 12985
           Metis_Print.ppString "END OF PROOF"]
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12986
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 12987
(*MetisDebug
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12988
      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
 12989
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12990
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12991
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12992
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12993
val inferenceToString = Metis_Print.toString ppInference;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12994
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 12995
val toString = Metis_Print.toString pp;
23442
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
(* Reconstructing single inferences.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 12999
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13000
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 13001
fun parents (Axiom _) = []
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 13002
  | parents (Assume _) = []
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13003
  | parents (Metis_Subst (_,th)) = [th]
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 13004
  | parents (Resolve (_,th,th')) = [th,th']
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 13005
  | parents (Refl _) = []
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 13006
  | parents (Equality _) = [];
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 13007
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13008
fun inferenceToThm (Axiom cl) = Metis_Thm.axiom cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13009
  | inferenceToThm (Assume atm) = Metis_Thm.assume (true,atm)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13010
  | inferenceToThm (Metis_Subst (sub,th)) = Metis_Thm.subst sub th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13011
  | 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
 13012
  | inferenceToThm (Refl tm) = Metis_Thm.refl tm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13013
  | 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
 13014
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13015
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13016
  fun reconstructSubst cl cl' =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13017
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13018
        fun recon [] =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13019
            let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13020
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13021
              val () = Metis_Print.trace Metis_LiteralSet.pp "reconstructSubst: cl" cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13022
              val () = Metis_Print.trace Metis_LiteralSet.pp "reconstructSubst: cl'" cl'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13023
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13024
            in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13025
              raise Bug "can't reconstruct Metis_Subst rule"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13026
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13027
          | recon (([],sub) :: others) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13028
            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
 13029
            else recon others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13030
          | recon ((lit :: lits, sub) :: others) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13031
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13032
              fun checkLit (lit',acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13033
                  case total (Metis_Literal.match sub lit) lit' of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13034
                    NONE => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13035
                  | SOME sub => (lits,sub) :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13036
            in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13037
              recon (Metis_LiteralSet.foldl checkLit others cl')
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13038
            end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13039
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13040
        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
 13041
      end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13042
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13043
      handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13044
        raise Bug ("Metis_Proof.recontructSubst: shouldn't fail:\n" ^ err);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13045
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13046
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13047
  fun reconstructResolvant cl1 cl2 cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13048
      (if not (Metis_LiteralSet.subset cl1 cl) then
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13049
         Metis_LiteralSet.pick (Metis_LiteralSet.difference cl1 cl)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13050
       else if not (Metis_LiteralSet.subset cl2 cl) then
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13051
         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
 13052
       else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13053
         (* A useless resolution, but we must reconstruct it anyway *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13054
         let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13055
           val cl1' = Metis_LiteralSet.negate cl1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13056
           and cl2' = Metis_LiteralSet.negate cl2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13057
           val lits = Metis_LiteralSet.intersectList [cl1,cl1',cl2,cl2']
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13058
         in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13059
           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
 13060
           else raise Bug "can't reconstruct Resolve rule"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13061
         end)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13062
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13063
      handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13064
        raise Bug ("Metis_Proof.recontructResolvant: shouldn't fail:\n" ^ err);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13065
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13066
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13067
  fun reconstructEquality cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13068
      let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13069
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13070
        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
 13071
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13072
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13073
        fun sync s t path (f,a) (f',a') =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13074
            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
 13075
            else
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13076
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13077
                val itms = enumerate (zip a a')
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13078
              in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13079
                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
 13080
                  [(i,(tm,tm'))] =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13081
                  let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13082
                    val path = i :: path
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13083
                  in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13084
                    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
 13085
                      SOME (List.rev path)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13086
                    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13087
                      case (tm,tm') of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13088
                        (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
 13089
                      | _ => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13090
                  end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13091
                | _ => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13092
              end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13093
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13094
        fun recon (neq,(pol,atm),(pol',atm')) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13095
            if pol = pol' then NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13096
            else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13097
              let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13098
                val (s,t) = Metis_Literal.destNeq neq
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
                val path =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13101
                    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
 13102
                    else if not (Metis_Atom.equal atm atm') then NONE
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13103
                    else Metis_Atom.find (Metis_Term.equal s) atm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13104
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13105
                case path of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13106
                  SOME path => SOME ((pol',atm),path,t)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13107
                | NONE => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13108
              end
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
        val candidates =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13111
            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
 13112
              ([l1],[l2,l3]) => [(l1,l2,l3),(l1,l3,l2)]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13113
            | ([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
 13114
            | ([l1],[l2]) => [(l1,l1,l2),(l1,l2,l1)]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13115
            | _ => raise Bug "reconstructEquality: malformed"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13116
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13117
(*MetisTrace3
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13118
        val ppCands =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13119
            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
 13120
        val () = Metis_Print.trace ppCands
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13121
                   "Metis_Proof.reconstructEquality: candidates" candidates
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13122
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13123
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13124
        case first recon candidates of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13125
          SOME info => info
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13126
        | NONE => raise Bug "can't reconstruct Equality rule"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13127
      end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13128
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13129
      handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13130
        raise Bug ("Metis_Proof.recontructEquality: shouldn't fail:\n" ^ err);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13131
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13132
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13133
  fun reconstruct cl (Metis_Thm.Axiom,[]) = Axiom cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13134
    | reconstruct cl (Metis_Thm.Assume,[]) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13135
      (case Metis_LiteralSet.findl Metis_Literal.positive cl of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13136
         SOME (_,atm) => Assume atm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13137
       | NONE => raise Bug "malformed Assume inference")
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13138
    | reconstruct cl (Metis_Thm.Metis_Subst,[th]) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13139
      Metis_Subst (reconstructSubst (Metis_Thm.clause th) cl, th)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13140
    | reconstruct cl (Metis_Thm.Resolve,[th1,th2]) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13141
      let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13142
        val cl1 = Metis_Thm.clause th1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13143
        and cl2 = Metis_Thm.clause th2
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13144
        val (pol,atm) = reconstructResolvant cl1 cl2 cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13145
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13146
        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
 13147
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13148
    | reconstruct cl (Metis_Thm.Refl,[]) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13149
      (case Metis_LiteralSet.findl (K true) cl of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13150
         SOME lit => Refl (Metis_Literal.destRefl lit)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13151
       | NONE => raise Bug "malformed Refl inference")
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13152
    | reconstruct cl (Metis_Thm.Equality,[]) = Equality (reconstructEquality cl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13153
    | reconstruct _ _ = raise Bug "malformed inference";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13154
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13155
  fun thmToInference th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13156
      let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13157
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13158
        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
 13159
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13160
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13161
        val cl = Metis_Thm.clause th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13162
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13163
        val thmInf = Metis_Thm.inference th
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13164
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13165
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13166
        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
 13167
        val () = Metis_Print.trace ppThmInf "Metis_Proof.thmToInference: thmInf" thmInf
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13168
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13169
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13170
        val inf = reconstruct cl thmInf
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13171
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13172
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13173
        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
 13174
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13175
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13176
        val () =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13177
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13178
              val th' = inferenceToThm inf
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13179
            in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13180
              if Metis_LiteralSet.equal (Metis_Thm.clause th') cl then ()
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13181
              else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13182
                raise
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13183
                  Bug
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13184
                    ("Metis_Proof.thmToInference: bad inference reconstruction:" ^
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13185
                     "\n  th = " ^ Metis_Thm.toString th ^
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13186
                     "\n  inf = " ^ inferenceToString inf ^
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13187
                     "\n  inf th = " ^ Metis_Thm.toString th')
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13188
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13189
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13190
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13191
        inf
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13192
      end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13193
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13194
      handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13195
        raise Bug ("Metis_Proof.thmToInference: shouldn't fail:\n" ^ err);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13196
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13197
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13198
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13199
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13200
(* Reconstructing whole proofs.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13201
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13202
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13203
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13204
  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
 13205
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13206
  fun addThms (th,ths) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13207
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13208
        val cl = Metis_Thm.clause th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13209
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13210
        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
 13211
        else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13212
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13213
            val (_,pars) = Metis_Thm.inference th
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13214
            val ths = List.foldl addThms ths pars
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13215
          in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13216
            if Metis_LiteralSetMap.inDomain cl ths then ths
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13217
            else Metis_LiteralSetMap.insert ths (cl,th)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13218
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13219
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13220
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13221
  fun mkThms th = addThms (th,emptyThms);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13222
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13223
  fun addProof (th,(ths,acc)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13224
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13225
        val cl = Metis_Thm.clause th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13226
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13227
        case Metis_LiteralSetMap.peek ths cl of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13228
          NONE => (ths,acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13229
        | SOME th =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13230
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13231
            val (_,pars) = Metis_Thm.inference th
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13232
            val (ths,acc) = List.foldl addProof (ths,acc) pars
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13233
            val ths = Metis_LiteralSetMap.delete ths cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13234
            val acc = (th, thmToInference th) :: acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13235
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13236
            (ths,acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13237
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13238
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13239
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13240
  fun mkProof ths th =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13241
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13242
        val (ths,acc) = addProof (th,(ths,[]))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13243
(*MetisTrace4
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13244
        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
 13245
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13246
      in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 13247
        List.rev acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13248
      end;
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
  fun proof th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13251
      let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13252
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13253
        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
 13254
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13255
        val ths = mkThms th
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13256
        val infs = mkProof ths th
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13257
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13258
        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
 13259
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13260
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13261
        infs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13262
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13263
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13264
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13265
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13266
(* Free variables.                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13267
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13268
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13269
fun freeIn v =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13270
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13271
      fun free th_inf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13272
          case th_inf of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13273
            (_, Axiom lits) => Metis_LiteralSet.freeIn v lits
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13274
          | (_, Assume atm) => Metis_Atom.freeIn v atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13275
          | (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
 13276
          | (_, Resolve _) => false
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13277
          | (_, Refl tm) => Metis_Term.freeIn v tm
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13278
          | (_, Equality (lit,_,tm)) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13279
            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
 13280
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13281
      List.exists free
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13282
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13283
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13284
val freeVars =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13285
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13286
      fun inc (th_inf,set) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13287
          Metis_NameSet.union set
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13288
          (case th_inf of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13289
             (_, Axiom lits) => Metis_LiteralSet.freeVars lits
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13290
           | (_, Assume atm) => Metis_Atom.freeVars atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13291
           | (th, Metis_Subst _) => Metis_Thm.freeVars th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13292
           | (_, Resolve _) => Metis_NameSet.empty
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13293
           | (_, Refl tm) => Metis_Term.freeVars tm
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13294
           | (_, Equality (lit,_,tm)) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13295
             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
 13296
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13297
      List.foldl inc Metis_NameSet.empty
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13298
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13299
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13300
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13301
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 13302
(**** Original file: src/Rule.sig ****)
23442
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
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13305
(* DERIVED RULES FOR CREATING FIRST ORDER LOGIC THEOREMS                     *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 13306
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13309
signature Metis_Rule =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13310
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13311
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13312
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13313
(* 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
 13314
(* t = u \/ C.                                                               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13315
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13316
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13317
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
 13318
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13319
val ppEquation : equation Metis_Print.pp
23442
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
val equationToString : equation -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13322
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13323
(* 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
 13324
val equationLiteral : equation -> Metis_Literal.literal option
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13325
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13326
val reflEqn : Metis_Term.term -> equation
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13327
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13328
val symEqn : equation -> equation
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13329
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13330
val transEqn : equation -> equation -> equation
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13331
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13332
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13333
(* A conversion takes a term t and either:                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13334
(* 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
 13335
(* 2. Raises an Error exception.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13336
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13337
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13338
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
 13339
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13340
val allConv : conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13341
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13342
val noConv : conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13343
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13344
val thenConv : conv -> conv -> conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13345
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13346
val orelseConv : conv -> conv -> conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13347
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13348
val tryConv : conv -> conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13349
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13350
val repeatConv : conv -> conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13351
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13352
val firstConv : conv list -> conv
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
val everyConv : conv list -> conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13355
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13356
val rewrConv : equation -> Metis_Term.path -> conv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13357
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13358
val pathConv : conv -> Metis_Term.path -> conv
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13359
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13360
val subtermConv : conv -> int -> conv
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
val subtermsConv : conv -> conv  (* All function arguments *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13363
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13364
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13365
(* Applying a conversion to every subterm, with some traversal strategy.     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13366
(* ------------------------------------------------------------------------- *)
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
val bottomUpConv : conv -> conv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13369
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13370
val topDownConv : conv -> conv
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
val repeatTopDownConv : conv -> conv  (* useful for rewriting *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13373
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
(* A literule (bad pun) takes a literal L and either:                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13376
(* 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
 13377
(* 2. Raises an Error exception.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13378
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13379
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13380
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
 13381
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13382
val allLiterule : literule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13383
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13384
val noLiterule : literule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13385
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13386
val thenLiterule : literule -> literule -> literule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13387
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13388
val orelseLiterule : literule -> literule -> literule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13389
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13390
val tryLiterule : literule -> literule
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
val repeatLiterule : literule -> literule
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
val firstLiterule : literule list -> literule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13395
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13396
val everyLiterule : literule list -> literule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13397
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13398
val rewrLiterule : equation -> Metis_Term.path -> literule
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13399
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13400
val pathLiterule : conv -> Metis_Term.path -> literule
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13401
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13402
val argumentLiterule : conv -> int -> literule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13403
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13404
val allArgumentsLiterule : conv -> literule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13405
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13406
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13407
(* 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
 13408
(* exception.                                                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13409
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13410
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13411
type rule = Metis_Thm.thm -> Metis_Thm.thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13412
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13413
val allRule : rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13414
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13415
val noRule : rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13416
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13417
val thenRule : rule -> rule -> rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13418
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13419
val orelseRule : rule -> rule -> rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13420
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13421
val tryRule : rule -> rule
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
val changedRule : rule -> rule
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
val repeatRule : rule -> rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13426
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13427
val firstRule : rule list -> rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13428
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13429
val everyRule : rule list -> rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13430
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13431
val literalRule : literule -> Metis_Literal.literal -> rule
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13432
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13433
val rewrRule : equation -> Metis_Literal.literal -> Metis_Term.path -> rule
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13434
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13435
val pathRule : conv -> Metis_Literal.literal -> Metis_Term.path -> rule
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13436
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13437
val literalsRule : literule -> Metis_LiteralSet.set -> rule
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13438
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13439
val allLiteralsRule : literule -> rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13440
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13441
val convRule : conv -> rule  (* All arguments of all literals *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13443
(* ------------------------------------------------------------------------- *)
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
(* --------- reflexivity                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13446
(*   x = x                                                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13447
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13448
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13449
val reflexivityRule : Metis_Term.term -> Metis_Thm.thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13450
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13451
val reflexivity : Metis_Thm.thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13452
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13453
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13454
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13455
(* --------------------- symmetry                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13456
(*   ~(x = y) \/ y = x                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13457
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13458
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13459
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
 13460
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13461
val symmetry : Metis_Thm.thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13462
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13463
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13464
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13465
(* --------------------------------- transitivity                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13466
(*   ~(x = y) \/ ~(y = z) \/ x = z                                           *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13469
val transitivity : Metis_Thm.thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13470
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13471
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13472
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13473
(* ---------------------------------------------- functionCongruence (f,n)   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13474
(*   ~(x0 = y0) \/ ... \/ ~(x{n-1} = y{n-1}) \/                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13475
(*   f x0 ... x{n-1} = f y0 ... y{n-1}                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13476
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13477
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13478
val functionCongruence : Metis_Term.function -> Metis_Thm.thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13479
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13480
(* ------------------------------------------------------------------------- *)
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
(* ---------------------------------------------- relationCongruence (R,n)   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13483
(*   ~(x0 = y0) \/ ... \/ ~(x{n-1} = y{n-1}) \/                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13484
(*   ~R x0 ... x{n-1} \/ R y0 ... y{n-1}                                     *)
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
val relationCongruence : Metis_Atom.relation -> 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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13490
(*   x = y \/ C                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13491
(* -------------- symEq (x = y)                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13492
(*   y = x \/ C                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13493
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13494
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13495
val symEq : Metis_Literal.literal -> rule
23442
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13498
(*   ~(x = y) \/ C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13499
(* ----------------- symNeq ~(x = y)                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13500
(*   ~(y = x) \/ C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13501
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13502
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13503
val symNeq : Metis_Literal.literal -> rule
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13504
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13505
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13506
(* 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
 13507
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13508
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13509
val sym : Metis_Literal.literal -> rule
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13510
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13511
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13512
(*   ~(x = x) \/ C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13513
(* ----------------- removeIrrefl                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13514
(*         C                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13515
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13516
(* where all irreflexive equalities.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13517
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13518
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13519
val removeIrrefl : rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13520
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13521
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13522
(*   x = y \/ y = x \/ C                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13523
(* ----------------------- removeSym                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13524
(*       x = y \/ C                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13525
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13526
(* where all duplicate copies of equalities and disequalities are removed.   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13527
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13528
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13529
val removeSym : rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13530
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13531
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13532
(*   ~(v = t) \/ C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13533
(* ----------------- expandAbbrevs                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13534
(*      C[t/v]                                                               *)
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
(* where t must not contain any occurrence of the variable v.                *)
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13539
val expandAbbrevs : rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13540
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13541
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13542
(* simplify = isTautology + expandAbbrevs + removeSym                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13543
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13544
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13545
val simplify : Metis_Thm.thm -> Metis_Thm.thm option
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13546
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
(*    C                                                                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13549
(* -------- freshVars                                                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13550
(*   C[s]                                                                    *)
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
(* 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
 13553
(* C are replaced by fresh variables.                                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13554
(* ------------------------------------------------------------------------- *)
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
val freshVars : rule
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13557
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13558
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13559
(*               C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13560
(* ---------------------------- factor                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13561
(*   C_s_1, C_s_2, ..., C_s_n                                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13562
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13563
(* 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
 13564
(*                                                                           *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13565
(*   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
 13566
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13567
(* has fewer literals than C.                                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13568
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13569
(* 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
 13570
(* 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
 13571
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13572
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13573
val factor' : Metis_Thm.clause -> Metis_Subst.subst list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13574
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13575
val factor : Metis_Thm.thm -> Metis_Thm.thm list
23442
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
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13578
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 13579
(**** Original file: src/Rule.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13580
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13581
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13582
(* DERIVED RULES FOR CREATING FIRST ORDER LOGIC THEOREMS                     *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 13583
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13584
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13585
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13586
structure Metis_Rule :> Metis_Rule =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13587
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13588
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13589
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13590
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13591
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13592
(* Variable names.                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13593
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13594
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13595
val xVarName = Metis_Name.fromString "x";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13596
val xVar = Metis_Term.Var xVarName;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13597
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13598
val yVarName = Metis_Name.fromString "y";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13599
val yVar = Metis_Term.Var yVarName;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13600
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13601
val zVarName = Metis_Name.fromString "z";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13602
val zVar = Metis_Term.Var zVarName;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13603
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13604
fun xIVarName i = Metis_Name.fromString ("x" ^ Int.toString i);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13605
fun xIVar i = Metis_Term.Var (xIVarName i);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13606
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13607
fun yIVarName i = Metis_Name.fromString ("y" ^ Int.toString i);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13608
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
 13609
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13610
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13611
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13612
(* --------- reflexivity                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13613
(*   x = x                                                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13614
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13615
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13616
fun reflexivityRule x = Metis_Thm.refl x;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13617
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13618
val reflexivity = reflexivityRule xVar;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13619
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13620
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13621
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13622
(* --------------------- symmetry                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13623
(*   ~(x = y) \/ y = x                                                       *)
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
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13626
fun symmetryRule x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13627
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13628
      val reflTh = reflexivityRule x
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13629
      val reflLit = Metis_Thm.destUnit reflTh
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13630
      val eqTh = Metis_Thm.equality reflLit [0] y
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13631
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13632
      Metis_Thm.resolve reflLit reflTh eqTh
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13633
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13634
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13635
val symmetry = symmetryRule xVar yVar;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13636
23442
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
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13639
(* --------------------------------- transitivity                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13640
(*   ~(x = y) \/ ~(y = z) \/ x = z                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13641
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13642
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13643
val transitivity =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13644
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13645
      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
 13646
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13647
      Metis_Thm.resolve (Metis_Literal.mkEq (yVar,xVar)) symmetry eqTh
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13648
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13649
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13650
(* ------------------------------------------------------------------------- *)
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
(* -------------- symEq (x = y)                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13653
(*   y = x \/ C                                                              *)
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
fun symEq lit th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13657
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13658
      val (x,y) = Metis_Literal.destEq lit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13659
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13660
      if Metis_Term.equal x y then th
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13661
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13662
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13663
          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
 13664
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13665
          val symTh = Metis_Thm.subst sub symmetry
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13666
        in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13667
          Metis_Thm.resolve lit th symTh
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
    end;
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13672
(* 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
 13673
(* t = u \/ C.                                                               *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13676
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
 13677
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 13678
fun ppEquation ((_,th) : equation) = Metis_Thm.pp th;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 13679
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 13680
val equationToString = Metis_Print.toString ppEquation;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13681
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13682
fun equationLiteral (t_u,th) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13683
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13684
      val lit = Metis_Literal.mkEq t_u
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13685
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13686
      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
 13687
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13688
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13689
fun reflEqn t = ((t,t), Metis_Thm.refl t);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13690
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13691
fun symEqn (eqn as ((t,u), th)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13692
    if Metis_Term.equal t u then eqn
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13693
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13694
      ((u,t),
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13695
       case equationLiteral eqn of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13696
         SOME t_u => symEq t_u th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13697
       | NONE => th);
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
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
 13700
    if Metis_Term.equal x y then eqn2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13701
    else if Metis_Term.equal y z then eqn1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13702
    else if Metis_Term.equal x z then reflEqn x
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13703
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13704
      ((x,z),
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13705
       case equationLiteral eqn1 of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13706
         NONE => th1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13707
       | SOME x_y =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13708
         case equationLiteral eqn2 of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13709
           NONE => th2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13710
         | SOME y_z =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13711
           let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13712
             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
 13713
             val th = Metis_Thm.subst sub transitivity
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13714
             val th = Metis_Thm.resolve x_y th1 th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13715
             val th = Metis_Thm.resolve y_z th2 th
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13716
           in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13717
             th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13718
           end);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13719
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13720
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13721
val transEqn = fn eqn1 => fn eqn2 =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13722
    transEqn eqn1 eqn2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13723
    handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13724
      raise Error ("Metis_Rule.transEqn:\neqn1 = " ^ equationToString eqn1 ^
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13725
                   "\neqn2 = " ^ equationToString eqn2 ^ "\n" ^ err);
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13728
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13729
(* A conversion takes a term t and either:                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13730
(* 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
 13731
(* 2. Raises an Error exception.                                             *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13734
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
 13735
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13736
fun allConv tm = (tm, Metis_Thm.refl tm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13737
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13738
val noConv : conv = fn _ => raise Error "noConv";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13739
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 13740
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13741
fun traceConv s conv tm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13742
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13743
      val res as (tm',th) = conv tm
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 13744
      val () = trace (s ^ ": " ^ Metis_Term.toString tm ^ " --> " ^
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13745
                      Metis_Term.toString tm' ^ " " ^ Metis_Thm.toString th ^ "\n")
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13746
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13747
      res
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13748
    end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13749
    handle Error err =>
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 13750
      (trace (s ^ ": " ^ Metis_Term.toString tm ^ " --> Error: " ^ err ^ "\n");
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13751
       raise Error (s ^ ": " ^ err));
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 13752
*)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13753
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13754
fun thenConvTrans tm (tm',th1) (tm'',th2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13755
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13756
      val eqn1 = ((tm,tm'),th1)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13757
      and eqn2 = ((tm',tm''),th2)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13758
      val (_,th) = transEqn eqn1 eqn2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13759
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13760
      (tm'',th)
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 thenConv conv1 conv2 tm =
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
      val res1 as (tm',_) = conv1 tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13766
      val res2 = conv2 tm'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13767
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13768
      thenConvTrans tm res1 res2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13769
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13770
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13771
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
 13772
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13773
fun tryConv conv = orelseConv conv allConv;
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 changedConv conv tm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13776
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13777
      val res as (tm',_) = conv tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13778
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13779
      if tm = tm' then raise Error "changedConv" else res
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13780
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13781
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13782
fun repeatConv conv tm = tryConv (thenConv conv (repeatConv conv)) tm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13783
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13784
fun firstConv [] _ = raise Error "firstConv"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13785
  | firstConv [conv] tm = conv tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13786
  | firstConv (conv :: convs) tm = orelseConv conv (firstConv convs) tm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13787
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13788
fun everyConv [] tm = allConv tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13789
  | everyConv [conv] tm = conv tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13790
  | everyConv (conv :: convs) tm = thenConv conv (everyConv convs) tm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13791
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13792
fun rewrConv (eqn as ((x,y), eqTh)) path tm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13793
    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
 13794
    else if List.null path then (y,eqTh)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13795
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13796
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13797
        val reflTh = Metis_Thm.refl tm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13798
        val reflLit = Metis_Thm.destUnit reflTh
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13799
        val th = Metis_Thm.equality reflLit (1 :: path) y
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13800
        val th = Metis_Thm.resolve reflLit reflTh th
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13801
        val th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13802
            case equationLiteral eqn of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13803
              NONE => th
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13804
            | SOME x_y => Metis_Thm.resolve x_y eqTh th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13805
        val tm' = Metis_Term.replace tm (path,y)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13806
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13807
        (tm',th)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13808
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13809
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13810
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13811
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
 13812
    rewrConv eqn path tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13813
    handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13814
      raise Error ("Metis_Rule.rewrConv:\nx = " ^ Metis_Term.toString x ^
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13815
                   "\ny = " ^ Metis_Term.toString y ^
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13816
                   "\neqTh = " ^ Metis_Thm.toString eqTh ^
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13817
                   "\npath = " ^ Metis_Term.pathToString path ^
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13818
                   "\ntm = " ^ Metis_Term.toString tm ^ "\n" ^ err);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13819
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13820
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13821
fun pathConv conv path tm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13822
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13823
      val x = Metis_Term.subterm tm path
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13824
      val (y,th) = conv x
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13825
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13826
      rewrConv ((x,y),th) path tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13827
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13828
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13829
fun subtermConv conv i = pathConv conv [i];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13830
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13831
fun subtermsConv _ (tm as Metis_Term.Var _) = allConv tm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13832
  | subtermsConv conv (tm as Metis_Term.Fn (_,a)) =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 13833
    everyConv (List.map (subtermConv conv) (interval 0 (length a))) tm;
23442
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13836
(* Applying a conversion to every subterm, with some traversal strategy.     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13837
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13838
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13839
fun bottomUpConv conv tm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13840
    thenConv (subtermsConv (bottomUpConv conv)) (repeatConv conv) tm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13841
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13842
fun topDownConv conv tm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13843
    thenConv (repeatConv conv) (subtermsConv (topDownConv conv)) tm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13844
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13845
fun repeatTopDownConv conv =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13846
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13847
      fun f tm = thenConv (repeatConv conv) g tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13848
      and g tm = thenConv (subtermsConv f) h tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13849
      and h tm = tryConv (thenConv conv f) tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13850
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13851
      f
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13852
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13853
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13854
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13855
val repeatTopDownConv = fn conv => fn tm =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13856
    repeatTopDownConv conv tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13857
    handle Error err => raise Error ("repeatTopDownConv: " ^ err);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13858
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13859
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13860
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13861
(* A literule (bad pun) takes a literal L and either:                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13862
(* 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
 13863
(* 2. Raises an Error exception.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13864
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13865
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13866
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
 13867
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13868
fun allLiterule lit = (lit, Metis_Thm.assume lit);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13869
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13870
val noLiterule : literule = fn _ => raise Error "noLiterule";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13871
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13872
fun thenLiterule literule1 literule2 lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13873
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13874
      val res1 as (lit',th1) = literule1 lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13875
      val res2 as (lit'',th2) = literule2 lit'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13876
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13877
      if Metis_Literal.equal lit lit' then res2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13878
      else if Metis_Literal.equal lit' lit'' then res1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13879
      else if Metis_Literal.equal lit lit'' then allLiterule lit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13880
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13881
        (lit'',
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13882
         if not (Metis_Thm.member lit' th1) then th1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13883
         else if not (Metis_Thm.negateMember lit' th2) then th2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13884
         else Metis_Thm.resolve lit' th1 th2)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13885
    end;
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
fun orelseLiterule (literule1 : literule) literule2 lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13888
    literule1 lit handle Error _ => literule2 lit;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13889
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13890
fun tryLiterule literule = orelseLiterule literule allLiterule;
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 changedLiterule literule lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13893
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13894
      val res as (lit',_) = literule lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13895
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13896
      if lit = lit' then raise Error "changedLiterule" else res
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13897
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13898
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13899
fun repeatLiterule literule lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13900
    tryLiterule (thenLiterule literule (repeatLiterule literule)) lit;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13901
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13902
fun firstLiterule [] _ = raise Error "firstLiterule"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13903
  | firstLiterule [literule] lit = literule lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13904
  | firstLiterule (literule :: literules) lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13905
    orelseLiterule literule (firstLiterule literules) lit;
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
fun everyLiterule [] lit = allLiterule lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13908
  | everyLiterule [literule] lit = literule lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13909
  | everyLiterule (literule :: literules) lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13910
    thenLiterule literule (everyLiterule literules) lit;
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
fun rewrLiterule (eqn as ((x,y),eqTh)) path lit =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13913
    if Metis_Term.equal x y then allLiterule lit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13914
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13915
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13916
        val th = Metis_Thm.equality lit path y
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13917
        val th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13918
            case equationLiteral eqn of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13919
              NONE => th
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13920
            | SOME x_y => Metis_Thm.resolve x_y eqTh th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13921
        val lit' = Metis_Literal.replace lit (path,y)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13922
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13923
        (lit',th)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13924
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13925
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13926
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13927
val rewrLiterule = fn eqn => fn path => fn lit =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13928
    rewrLiterule eqn path lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13929
    handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13930
      raise Error ("Metis_Rule.rewrLiterule:\neqn = " ^ equationToString eqn ^
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13931
                   "\npath = " ^ Metis_Term.pathToString path ^
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13932
                   "\nlit = " ^ Metis_Literal.toString lit ^ "\n" ^ err);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13933
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13934
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13935
fun pathLiterule conv path lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13936
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13937
      val tm = Metis_Literal.subterm lit path
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13938
      val (tm',th) = conv tm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13939
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13940
      rewrLiterule ((tm,tm'),th) path lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13941
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13942
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13943
fun argumentLiterule conv i = pathLiterule conv [i];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13944
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13945
fun allArgumentsLiterule conv lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13946
    everyLiterule
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 13947
      (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
 13948
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13949
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13950
(* 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
 13951
(* exception.                                                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13952
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13953
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13954
type rule = Metis_Thm.thm -> Metis_Thm.thm;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13955
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13956
val allRule : rule = fn th => th;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13957
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13958
val noRule : rule = fn _ => raise Error "noRule";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13959
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13960
fun thenRule (rule1 : rule) (rule2 : rule) th = rule1 (rule2 th);
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
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
 13963
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13964
fun tryRule rule = orelseRule rule allRule;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13965
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13966
fun changedRule rule th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13967
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13968
      val th' = rule th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13969
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13970
      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
 13971
      else raise Error "changedRule"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13972
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13973
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13974
fun repeatRule rule lit = tryRule (thenRule rule (repeatRule rule)) lit;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13975
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13976
fun firstRule [] _ = raise Error "firstRule"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13977
  | firstRule [rule] th = rule th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13978
  | firstRule (rule :: rules) th = orelseRule rule (firstRule rules) th;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13979
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13980
fun everyRule [] th = allRule th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13981
  | everyRule [rule] th = rule th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13982
  | everyRule (rule :: rules) th = thenRule rule (everyRule rules) th;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13983
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13984
fun literalRule literule lit th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13985
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13986
      val (lit',litTh) = literule lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13987
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13988
      if Metis_Literal.equal lit lit' then th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13989
      else if not (Metis_Thm.negateMember lit litTh) then litTh
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13990
      else Metis_Thm.resolve lit th litTh
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13991
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13992
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 13993
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13994
val literalRule = fn literule => fn lit => fn th =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13995
    literalRule literule lit th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13996
    handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13997
      raise Error ("Metis_Rule.literalRule:\nlit = " ^ Metis_Literal.toString lit ^
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 13998
                   "\nth = " ^ Metis_Thm.toString th ^ "\n" ^ err);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 13999
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14000
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14001
fun rewrRule eqTh lit path = literalRule (rewrLiterule eqTh path) lit;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14002
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14003
fun pathRule conv lit path = literalRule (pathLiterule conv path) lit;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14004
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14005
fun literalsRule literule =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14006
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14007
      fun f (lit,th) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14008
          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
 14009
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14010
      fn lits => fn th => Metis_LiteralSet.foldl f th lits
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14011
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14012
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14013
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
 14014
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14015
fun convRule conv = allLiteralsRule (allArgumentsLiterule conv);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14016
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14017
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14018
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14019
(* ---------------------------------------------- functionCongruence (f,n)   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14020
(*   ~(x0 = y0) \/ ... \/ ~(x{n-1} = y{n-1}) \/                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14021
(*   f x0 ... x{n-1} = f y0 ... y{n-1}                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14022
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14023
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14024
fun functionCongruence (f,n) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14025
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14026
      val xs = List.tabulate (n,xIVar)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14027
      and ys = List.tabulate (n,yIVar)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14028
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14029
      fun cong ((i,yi),(th,lit)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14030
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14031
            val path = [1,i]
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14032
            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
 14033
            val lit = Metis_Literal.replace lit (path,yi)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14034
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14035
            (th,lit)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14036
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14037
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14038
      val reflTh = Metis_Thm.refl (Metis_Term.Fn (f,xs))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14039
      val reflLit = Metis_Thm.destUnit reflTh
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14040
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 14041
      fst (List.foldl cong (reflTh,reflLit) (enumerate ys))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14042
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14043
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14044
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14045
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14046
(* ---------------------------------------------- relationCongruence (R,n)   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14047
(*   ~(x0 = y0) \/ ... \/ ~(x{n-1} = y{n-1}) \/                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14048
(*   ~R x0 ... x{n-1} \/ R y0 ... y{n-1}                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14049
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14050
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14051
fun relationCongruence (R,n) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14052
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14053
      val xs = List.tabulate (n,xIVar)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14054
      and ys = List.tabulate (n,yIVar)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14055
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14056
      fun cong ((i,yi),(th,lit)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14057
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14058
            val path = [i]
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14059
            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
 14060
            val lit = Metis_Literal.replace lit (path,yi)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14061
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14062
            (th,lit)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14063
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14064
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14065
      val assumeLit = (false,(R,xs))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14066
      val assumeTh = Metis_Thm.assume assumeLit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14067
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 14068
      fst (List.foldl cong (assumeTh,assumeLit) (enumerate ys))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14069
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14070
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
(*   ~(x = y) \/ C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14073
(* ----------------- symNeq ~(x = y)                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14074
(*   ~(y = x) \/ C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14075
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14076
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14077
fun symNeq lit th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14078
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14079
      val (x,y) = Metis_Literal.destNeq lit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14080
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14081
      if Metis_Term.equal x y then th
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14082
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14083
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14084
          val sub = Metis_Subst.fromList [(xVarName,y),(yVarName,x)]
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14085
          val symTh = Metis_Thm.subst sub symmetry
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14086
        in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14087
          Metis_Thm.resolve lit th symTh
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14088
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14089
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14090
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14091
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14092
(* 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
 14093
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14094
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14095
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
 14096
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14097
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14098
(*   ~(x = x) \/ C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14099
(* ----------------- removeIrrefl                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14100
(*         C                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14101
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14102
(* where all irreflexive equalities.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14103
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14104
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14105
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14106
  fun irrefl ((true,_),th) = th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14107
    | irrefl (lit as (false,atm), th) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14108
      case total Metis_Atom.destRefl atm of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14109
        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
 14110
      | NONE => th;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14111
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14112
  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
 14113
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14114
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14115
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14116
(*   x = y \/ y = x \/ C                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14117
(* ----------------------- removeSym                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14118
(*       x = y \/ C                                                          *)
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
(* where all duplicate copies of equalities and disequalities are removed.   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14121
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14122
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14123
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14124
  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
 14125
      case total Metis_Atom.sym atm of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14126
        NONE => eqs_th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14127
      | SOME atm' =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14128
        if Metis_LiteralSet.member lit eqs then
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14129
          (eqs, if pol then symEq lit th else symNeq lit th)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14130
        else
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14131
          (Metis_LiteralSet.add eqs (pol,atm'), th);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14132
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14133
  fun removeSym th =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14134
      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
 14135
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14136
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14137
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14138
(*   ~(v = t) \/ C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14139
(* ----------------- expandAbbrevs                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14140
(*      C[t/v]                                                               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14141
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14142
(* where t must not contain any occurrence of the variable v.                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14143
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14144
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14145
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14146
  fun expand lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14147
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14148
        val (x,y) = Metis_Literal.destNeq lit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14149
        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
 14150
                raise Error "Metis_Rule.expandAbbrevs: no vars"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14151
        val _ = not (Metis_Term.equal x y) orelse
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14152
                raise Error "Metis_Rule.expandAbbrevs: equal vars"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14153
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14154
        Metis_Subst.unify Metis_Subst.empty x y
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14155
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14156
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14157
  fun expandAbbrevs th =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14158
      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
 14159
        NONE => removeIrrefl th
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14160
      | SOME sub => expandAbbrevs (Metis_Thm.subst sub th);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14161
end;
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14164
(* simplify = isTautology + expandAbbrevs + removeSym                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14165
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14166
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14167
fun simplify th =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14168
    if Metis_Thm.isTautology th then NONE
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14169
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14170
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14171
        val th' = th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14172
        val th' = expandAbbrevs th'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14173
        val th' = removeSym th'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14174
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14175
        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
 14176
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14177
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
(*    C                                                                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14180
(* -------- freshVars                                                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14181
(*   C[s]                                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14182
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14183
(* 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
 14184
(* C are replaced by fresh variables.                                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14185
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14186
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14187
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
 14188
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14189
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14190
(*               C                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14191
(* ---------------------------- factor                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14192
(*   C_s_1, C_s_2, ..., C_s_n                                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14193
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14194
(* 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
 14195
(*                                                                           *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14196
(*   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
 14197
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14198
(* has fewer literals than C.                                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14199
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14200
(* 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
 14201
(* 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
 14202
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14203
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14204
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14205
  datatype edge =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14206
      FactorEdge of Metis_Atom.atom * Metis_Atom.atom
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14207
    | ReflEdge of Metis_Term.term * Metis_Term.term;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14208
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14209
  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
 14210
    | 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
 14211
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14212
  datatype joinStatus =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14213
      Joined
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14214
    | Joinable of Metis_Subst.subst
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14215
    | Apart;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14216
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14217
  fun joinEdge sub edge =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14218
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14219
        val result =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14220
            case edge of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14221
              FactorEdge (atm,atm') => total (Metis_Atom.unify sub atm) atm'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14222
            | ReflEdge (tm,tm') => total (Metis_Subst.unify sub tm) tm'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14223
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14224
        case result of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14225
          NONE => Apart
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14226
        | SOME sub' =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14227
          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
 14228
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14229
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14230
  fun updateApart sub =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14231
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14232
        fun update acc [] = SOME acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14233
          | update acc (edge :: edges) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14234
            case joinEdge sub edge of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14235
              Joined => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14236
            | Joinable _ => update (edge :: acc) edges
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14237
            | Apart => update acc edges
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14238
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14239
        update []
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14240
      end;
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
  fun addFactorEdge (pol,atm) ((pol',atm'),acc) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14243
      if pol <> pol' then acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14244
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14245
        let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14246
          val edge = FactorEdge (atm,atm')
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14247
        in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14248
          case joinEdge Metis_Subst.empty edge of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14249
            Joined => raise Bug "addFactorEdge: joined"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14250
          | Joinable sub => (sub,edge) :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14251
          | Apart => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14252
        end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14253
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14254
  fun addReflEdge (false,_) acc = acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14255
    | addReflEdge (true,atm) acc =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14256
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14257
        val edge = ReflEdge (Metis_Atom.destEq atm)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14258
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14259
        case joinEdge Metis_Subst.empty edge of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14260
          Joined => raise Bug "addRefl: joined"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14261
        | Joinable _ => edge :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14262
        | Apart => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14263
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14264
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14265
  fun addIrreflEdge (true,_) acc = acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14266
    | addIrreflEdge (false,atm) acc =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14267
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14268
        val edge = ReflEdge (Metis_Atom.destEq atm)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14269
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14270
        case joinEdge Metis_Subst.empty edge of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14271
          Joined => raise Bug "addRefl: joined"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14272
        | Joinable sub => (sub,edge) :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14273
        | Apart => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14274
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14275
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14276
  fun init_edges acc _ [] =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14277
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14278
        fun init ((apart,sub,edge),(edges,acc)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14279
            (edge :: edges, (apart,sub,edges) :: acc)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14280
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14281
        snd (List.foldl init ([],[]) acc)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14282
      end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14283
    | init_edges acc apart ((sub,edge) :: sub_edges) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14284
      let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14285
(*MetisDebug
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14286
        val () = if not (Metis_Subst.null sub) then ()
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14287
                 else raise Bug "Metis_Rule.factor.init_edges: empty subst"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14288
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14289
        val (acc,apart) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14290
            case updateApart sub apart of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14291
              SOME apart' => ((apart',sub,edge) :: acc, edge :: apart)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14292
            | NONE => (acc,apart)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14293
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14294
        init_edges acc apart sub_edges
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14295
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14296
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14297
  fun mk_edges apart sub_edges [] = init_edges [] apart sub_edges
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14298
    | mk_edges apart sub_edges (lit :: lits) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14299
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14300
        val sub_edges = List.foldl (addFactorEdge lit) sub_edges lits
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14301
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14302
        val (apart,sub_edges) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14303
            case total Metis_Literal.sym lit of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14304
              NONE => (apart,sub_edges)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14305
            | SOME lit' =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14306
              let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14307
                val apart = addReflEdge lit apart
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14308
                val sub_edges = addIrreflEdge lit sub_edges
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14309
                val sub_edges = List.foldl (addFactorEdge lit') sub_edges lits
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14310
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14311
                (apart,sub_edges)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14312
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14313
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14314
        mk_edges apart sub_edges lits
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14315
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14316
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14317
  fun fact acc [] = acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14318
    | fact acc ((_,sub,[]) :: others) = fact (sub :: acc) others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14319
    | fact acc ((apart, sub, edge :: edges) :: others) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14320
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14321
        val others =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14322
            case joinEdge sub edge of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14323
              Joinable sub' =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14324
              let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14325
                val others = (edge :: apart, sub, edges) :: others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14326
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14327
                case updateApart sub' apart of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14328
                  NONE => others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14329
                | SOME apart' => (apart',sub',edges) :: others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14330
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14331
            | _ => (apart,sub,edges) :: others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14332
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14333
        fact acc others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14334
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14335
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14336
  fun factor' cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14337
      let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14338
(*MetisTrace6
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14339
        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
 14340
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14341
        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
 14342
(*MetisTrace6
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14343
        val ppEdgesSize = Metis_Print.ppMap length Metis_Print.ppInt
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14344
        val ppEdgel = Metis_Print.ppList ppEdge
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14345
        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
 14346
        val () = Metis_Print.trace ppEdgesSize "Metis_Rule.factor': |edges|" edges
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14347
        val () = Metis_Print.trace ppEdges "Metis_Rule.factor': edges" edges
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
        val result = fact [] edges
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14350
(*MetisTrace6
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14351
        val ppResult = Metis_Print.ppList Metis_Subst.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14352
        val () = Metis_Print.trace ppResult "Metis_Rule.factor': result" result
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14353
*)
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
        result
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
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14358
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14359
fun factor th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14360
    let
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 14361
      fun fact sub = removeIrrefl (removeSym (Metis_Thm.subst sub th))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14362
    in
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 14363
      List.map fact (factor' (Metis_Thm.clause th))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14364
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14365
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14366
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14367
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 14368
(**** Original file: src/Normalize.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14369
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14370
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14371
(* NORMALIZING FORMULAS                                                      *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 14372
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14373
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14374
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14375
signature Metis_Normalize =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14376
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14377
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
(* Negation normal form.                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14380
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14381
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14382
val nnf : Metis_Formula.formula -> Metis_Formula.formula
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14383
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
(* Conjunctive normal form derivations.                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14386
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14387
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14388
type thm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14389
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14390
datatype inference =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14391
    Axiom of Metis_Formula.formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14392
  | Definition of string * Metis_Formula.formula
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14393
  | Simplify of thm * thm list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14394
  | Conjunct of thm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14395
  | Specialize of thm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14396
  | Skolemize of thm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14397
  | Clausify of thm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14398
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14399
val mkAxiom : Metis_Formula.formula -> thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14400
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14401
val destThm : thm -> Metis_Formula.formula * inference
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14402
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14403
val proveThms :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14404
    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
 14405
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14406
val toStringInference : inference -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14407
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14408
val ppInference : inference Metis_Print.pp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14409
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14410
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14411
(* Conjunctive normal form.                                                  *)
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
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14414
type cnf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14415
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14416
val initialCnf : cnf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14417
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14418
val addCnf : thm -> cnf -> (Metis_Thm.clause * thm) list * cnf
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14419
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14420
val proveCnf : thm list -> (Metis_Thm.clause * thm) list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14421
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14422
val cnf : Metis_Formula.formula -> Metis_Thm.clause list
23442
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
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14425
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 14426
(**** Original file: src/Normalize.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14427
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14428
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14429
(* NORMALIZING FORMULAS                                                      *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 14430
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14431
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14432
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14433
structure Metis_Normalize :> Metis_Normalize =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14434
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14435
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14436
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14437
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14438
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14439
(* Constants.                                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14440
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14441
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14442
val prefix = "FOFtoCNF";
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14443
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14444
val skolemPrefix = "skolem" ^ prefix;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14445
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14446
val definitionPrefix = "definition" ^ prefix;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14447
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14448
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14449
(* Storing huge real numbers as their log.                                   *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14450
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14451
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14452
datatype logReal = LogReal of real;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14453
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14454
fun compareLogReal (LogReal logX, LogReal logY) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14455
    Real.compare (logX,logY);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14456
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14457
val zeroLogReal = LogReal ~1.0;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14458
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14459
val oneLogReal = LogReal 0.0;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14460
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14461
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14462
  fun isZero logX = logX < 0.0;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14463
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14464
  (* Assume logX >= logY >= 0.0 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14465
  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
 14466
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14467
  fun isZeroLogReal (LogReal logX) = isZero logX;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14468
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14469
  fun multiplyLogReal (LogReal logX) (LogReal logY) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14470
      if isZero logX orelse isZero logY then zeroLogReal
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14471
      else LogReal (logX + logY);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14472
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14473
  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
 14474
      if isZero logX then ly
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14475
      else if isZero logY then lx
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14476
      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
 14477
      else LogReal (add logX logY);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14478
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14479
  fun withinRelativeLogReal logDelta (LogReal logX) (LogReal logY) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14480
      isZero logX orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14481
      (not (isZero logY) andalso logX < logY + logDelta);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14482
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14483
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14484
fun toStringLogReal (LogReal logX) = Real.toString logX;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14485
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14486
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14487
(* Counting the clauses that would be generated by conjunctive normal form.  *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14488
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14489
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14490
val countLogDelta = 0.01;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14491
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14492
datatype count = Count of {positive : logReal, negative : logReal};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14493
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14494
fun countCompare (count1,count2) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14495
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14496
      val Count {positive = p1, negative = _} = count1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14497
      and Count {positive = p2, negative = _} = count2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14498
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14499
      compareLogReal (p1,p2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14500
    end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14501
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14502
fun countNegate (Count {positive = p, negative = n}) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14503
    Count {positive = n, negative = p};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14504
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14505
fun countLeqish count1 count2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14506
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14507
      val Count {positive = p1, negative = _} = count1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14508
      and Count {positive = p2, negative = _} = count2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14509
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14510
      withinRelativeLogReal countLogDelta p1 p2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14511
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14512
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14513
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14514
fun countEqualish count1 count2 =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14515
    countLeqish count1 count2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14516
    countLeqish count2 count1;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14517
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14518
fun countEquivish count1 count2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14519
    countEqualish count1 count2 andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14520
    countEqualish (countNegate count1) (countNegate count2);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14521
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14522
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14523
val countTrue = Count {positive = zeroLogReal, negative = oneLogReal};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14524
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14525
val countFalse = Count {positive = oneLogReal, negative = zeroLogReal};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14526
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14527
val countLiteral = Count {positive = oneLogReal, negative = oneLogReal};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14528
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14529
fun countAnd2 (count1,count2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14530
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14531
      val Count {positive = p1, negative = n1} = count1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14532
      and Count {positive = p2, negative = n2} = count2
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14533
      val p = addLogReal p1 p2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14534
      and n = multiplyLogReal n1 n2
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14535
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14536
      Count {positive = p, negative = n}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14537
    end;
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
fun countOr2 (count1,count2) =
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 Count {positive = p1, negative = n1} = count1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14542
      and Count {positive = p2, negative = n2} = count2
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14543
      val p = multiplyLogReal p1 p2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14544
      and n = addLogReal n1 n2
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14545
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14546
      Count {positive = p, negative = n}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14547
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14548
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14549
(* 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
 14550
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14551
fun countXor2 (count1,count2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14552
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14553
      val Count {positive = p1, negative = n1} = count1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14554
      and Count {positive = p2, negative = n2} = count2
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14555
      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
 14556
      and n = addLogReal (multiplyLogReal p1 n2) (multiplyLogReal n1 p2)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14557
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14558
      Count {positive = p, negative = n}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14559
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14560
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14561
fun countDefinition body_count = countXor2 (countLiteral,body_count);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14562
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14563
val countToString =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14564
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14565
      val rToS = toStringLogReal
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14566
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14567
      fn Count {positive = p, negative = n} =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14568
         "(+" ^ rToS p ^ ",-" ^ rToS n ^ ")"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14569
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14570
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14571
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
 14572
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14573
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14574
(* A type of normalized formula.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14575
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14576
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14577
datatype formula =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14578
    True
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14579
  | False
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14580
  | Metis_Literal of Metis_NameSet.set * Metis_Literal.literal
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14581
  | And of Metis_NameSet.set * count * formula Metis_Set.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14582
  | Or of Metis_NameSet.set * count * formula Metis_Set.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14583
  | 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
 14584
  | Exists of Metis_NameSet.set * count * Metis_NameSet.set * formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14585
  | Forall of Metis_NameSet.set * count * Metis_NameSet.set * formula;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14586
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14587
fun compare f1_f2 =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14588
    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
 14589
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14590
      case f1_f2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14591
        (True,True) => EQUAL
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14592
      | (True,_) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14593
      | (_,True) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14594
      | (False,False) => EQUAL
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14595
      | (False,_) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14596
      | (_,False) => GREATER
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14597
      | (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
 14598
      | (Metis_Literal _, _) => LESS
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14599
      | (_, Metis_Literal _) => GREATER
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14600
      | (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
 14601
      | (And _, _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14602
      | (_, And _) => GREATER
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14603
      | (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
 14604
      | (Or _, _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14605
      | (_, Or _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14606
      | (Xor (_,_,p1,s1), Xor (_,_,p2,s2)) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14607
        (case boolCompare (p1,p2) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14608
           LESS => LESS
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14609
         | EQUAL => Metis_Set.compare (s1,s2)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14610
         | GREATER => GREATER)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14611
      | (Xor _, _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14612
      | (_, Xor _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14613
      | (Exists (_,_,n1,f1), Exists (_,_,n2,f2)) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14614
        (case Metis_NameSet.compare (n1,n2) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14615
           LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14616
         | EQUAL => compare (f1,f2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14617
         | GREATER => GREATER)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14618
      | (Exists _, _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14619
      | (_, Exists _) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14620
      | (Forall (_,_,n1,f1), Forall (_,_,n2,f2)) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14621
        (case Metis_NameSet.compare (n1,n2) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14622
           LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14623
         | EQUAL => compare (f1,f2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14624
         | GREATER => GREATER);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14625
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14626
val empty = Metis_Set.empty compare;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14627
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14628
val singleton = Metis_Set.singleton compare;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14629
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14630
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14631
  fun neg True = False
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14632
    | neg False = True
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14633
    | 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
 14634
    | 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
 14635
    | 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
 14636
    | 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
 14637
    | 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
 14638
    | 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
 14639
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14640
  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
 14641
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14642
  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
 14643
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14644
  val negate = neg;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14645
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14646
  val negateSet = neg_set;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14647
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14648
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14649
fun negateMember x s = Metis_Set.member (negate x) s;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14650
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14651
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14652
  fun member s x = negateMember x s;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14653
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14654
  fun negateDisjoint s1 s2 =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14655
      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
 14656
      else not (Metis_Set.exists (member s1) s2);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14657
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14658
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14659
fun polarity True = true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14660
  | polarity False = false
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14661
  | polarity (Metis_Literal (_,(pol,_))) = not pol
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14662
  | polarity (And _) = true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14663
  | polarity (Or _) = false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14664
  | polarity (Xor (_,_,pol,_)) = pol
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14665
  | polarity (Exists _) = true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14666
  | polarity (Forall _) = false;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14667
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14668
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14669
val polarity = fn f =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14670
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14671
      val res1 = compare (f, negate f) = LESS
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14672
      val res2 = polarity f
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14673
      val _ = res1 = res2 orelse raise Bug "polarity"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14674
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14675
      res2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14676
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14677
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14678
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14679
fun applyPolarity true fm = fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14680
  | applyPolarity false fm = negate fm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14681
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14682
fun freeVars True = Metis_NameSet.empty
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14683
  | freeVars False = Metis_NameSet.empty
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14684
  | freeVars (Metis_Literal (fv,_)) = fv
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14685
  | freeVars (And (fv,_,_)) = fv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14686
  | freeVars (Or (fv,_,_)) = fv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14687
  | freeVars (Xor (fv,_,_,_)) = fv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14688
  | freeVars (Exists (fv,_,_,_)) = fv
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14689
  | freeVars (Forall (fv,_,_,_)) = fv;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14690
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14691
fun freeIn v fm = Metis_NameSet.member v (freeVars fm);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14692
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14693
val freeVarsSet =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14694
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14695
      fun free (fm,acc) = Metis_NameSet.union (freeVars fm) acc
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14696
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14697
      Metis_Set.foldl free Metis_NameSet.empty
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14698
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14699
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14700
fun count True = countTrue
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14701
  | count False = countFalse
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14702
  | count (Metis_Literal _) = countLiteral
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14703
  | count (And (_,c,_)) = c
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14704
  | count (Or (_,c,_)) = c
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14705
  | count (Xor (_,c,p,_)) = if p then c else countNegate c
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14706
  | count (Exists (_,c,_,_)) = c
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14707
  | count (Forall (_,c,_,_)) = c;
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
val countAndSet =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14710
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14711
      fun countAnd (fm,c) = countAnd2 (count fm, c)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14712
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14713
      Metis_Set.foldl countAnd countTrue
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14714
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14715
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14716
val countOrSet =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14717
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14718
      fun countOr (fm,c) = countOr2 (count fm, c)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14719
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14720
      Metis_Set.foldl countOr countFalse
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14721
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14722
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14723
val countXorSet =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14724
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14725
      fun countXor (fm,c) = countXor2 (count fm, c)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14726
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14727
      Metis_Set.foldl countXor countFalse
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14728
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14729
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14730
fun And2 (False,_) = False
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14731
  | And2 (_,False) = False
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14732
  | And2 (True,f2) = f2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14733
  | And2 (f1,True) = f1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14734
  | And2 (f1,f2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14735
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14736
      val (fv1,c1,s1) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14737
          case f1 of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14738
            And fv_c_s => fv_c_s
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14739
          | _ => (freeVars f1, count f1, singleton f1)
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
      and (fv2,c2,s2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14742
          case f2 of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14743
            And fv_c_s => fv_c_s
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14744
          | _ => (freeVars f2, count f2, singleton f2)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14745
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14746
      if not (negateDisjoint s1 s2) then False
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14747
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14748
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14749
          val s = Metis_Set.union s1 s2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14750
        in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14751
          case Metis_Set.size s of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14752
            0 => True
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14753
          | 1 => Metis_Set.pick s
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14754
          | n =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14755
            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
 14756
              And (Metis_NameSet.union fv1 fv2, countAnd2 (c1,c2), s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14757
            else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14758
              And (freeVarsSet s, countAndSet s, s)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14759
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14760
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14761
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14762
val AndList = List.foldl And2 True;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14763
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14764
val AndSet = Metis_Set.foldl And2 True;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14765
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14766
fun Or2 (True,_) = True
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14767
  | Or2 (_,True) = True
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14768
  | Or2 (False,f2) = f2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14769
  | Or2 (f1,False) = f1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14770
  | Or2 (f1,f2) =
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 (fv1,c1,s1) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14773
          case f1 of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14774
            Or fv_c_s => fv_c_s
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14775
          | _ => (freeVars f1, count f1, singleton f1)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14776
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14777
      and (fv2,c2,s2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14778
          case f2 of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14779
            Or fv_c_s => fv_c_s
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14780
          | _ => (freeVars f2, count f2, singleton f2)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14781
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14782
      if not (negateDisjoint s1 s2) then True
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14783
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14784
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14785
          val s = Metis_Set.union s1 s2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14786
        in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14787
          case Metis_Set.size s of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14788
            0 => False
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14789
          | 1 => Metis_Set.pick s
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14790
          | n =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14791
            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
 14792
              Or (Metis_NameSet.union fv1 fv2, countOr2 (c1,c2), s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14793
            else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14794
              Or (freeVarsSet s, countOrSet s, s)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14795
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14796
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14797
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14798
val OrList = List.foldl Or2 False;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14799
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14800
val OrSet = Metis_Set.foldl Or2 False;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14801
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14802
fun pushOr2 (f1,f2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14803
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14804
      val s1 = case f1 of And (_,_,s) => s | _ => singleton f1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14805
      and s2 = case f2 of And (_,_,s) => s | _ => singleton f2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14806
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14807
      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
 14808
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14809
      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
 14810
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14811
      Metis_Set.foldl f True s1
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
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14814
val pushOrList = List.foldl pushOr2 False;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14815
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14816
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14817
  fun normalize fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14818
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14819
        val p = polarity fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14820
        val fm = applyPolarity p fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14821
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14822
        (freeVars fm, count fm, p, singleton fm)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14823
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14824
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14825
  fun Xor2 (False,f2) = f2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14826
    | Xor2 (f1,False) = f1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14827
    | Xor2 (True,f2) = negate f2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14828
    | Xor2 (f1,True) = negate f1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14829
    | Xor2 (f1,f2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14830
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14831
        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
 14832
        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
 14833
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14834
        val s = Metis_Set.symmetricDifference s1 s2
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14835
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14836
        val fm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14837
            case Metis_Set.size s of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14838
              0 => False
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14839
            | 1 => Metis_Set.pick s
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14840
            | n =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14841
              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
 14842
                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
 14843
              else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14844
                Xor (freeVarsSet s, countXorSet s, true, s)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14845
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14846
        val p = p1 = p2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14847
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14848
        applyPolarity p fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14849
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14850
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14851
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14852
val XorList = List.foldl Xor2 False;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14853
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14854
val XorSet = Metis_Set.foldl Xor2 False;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14855
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14856
fun XorPolarityList (p,l) = applyPolarity p (XorList l);
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
fun XorPolaritySet (p,s) = applyPolarity p (XorSet s);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14859
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14860
fun destXor (Xor (_,_,p,s)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14861
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14862
      val (fm1,s) = Metis_Set.deletePick s
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14863
      val fm2 =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14864
          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
 14865
          else Xor (freeVarsSet s, countXorSet s, p, s)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14866
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14867
      (fm1,fm2)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14868
    end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14869
  | destXor _ = raise Error "destXor";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14870
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14871
fun pushXor fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14872
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14873
      val (f1,f2) = destXor fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14874
      val f1' = negate f1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14875
      and f2' = negate f2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14876
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14877
      And2 (Or2 (f1,f2), Or2 (f1',f2'))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14878
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14879
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14880
fun Exists1 (v,init_fm) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14881
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14882
      fun exists_gen fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14883
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14884
            val fv = Metis_NameSet.delete (freeVars fm) v
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14885
            val c = count fm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14886
            val n = Metis_NameSet.singleton v
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14887
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14888
            Exists (fv,c,n,fm)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14889
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14890
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14891
      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
 14892
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14893
      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
 14894
        | exists_free (fm as And (_,_,s)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14895
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14896
            val sv = Metis_Set.filter (freeIn v) s
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14897
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14898
            if Metis_Set.size sv <> 1 then exists_gen fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14899
            else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14900
              let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14901
                val fm = Metis_Set.pick sv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14902
                val s = Metis_Set.delete s fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14903
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14904
                And2 (exists_free fm, AndSet s)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14905
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14906
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14907
        | exists_free (Exists (fv,c,n,f)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14908
          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
 14909
        | exists_free fm = exists_gen fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14910
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14911
      exists init_fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14912
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14913
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14914
fun ExistsList (vs,f) = List.foldl Exists1 f vs;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14915
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14916
fun ExistsSet (n,f) = Metis_NameSet.foldl Exists1 f n;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14917
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14918
fun Forall1 (v,init_fm) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14919
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14920
      fun forall_gen fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14921
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14922
            val fv = Metis_NameSet.delete (freeVars fm) v
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14923
            val c = count fm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14924
            val n = Metis_NameSet.singleton v
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14925
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14926
            Forall (fv,c,n,fm)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14927
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14928
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14929
      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
 14930
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14931
      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
 14932
        | forall_free (fm as Or (_,_,s)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14933
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14934
            val sv = Metis_Set.filter (freeIn v) s
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14935
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14936
            if Metis_Set.size sv <> 1 then forall_gen fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14937
            else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14938
              let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14939
                val fm = Metis_Set.pick sv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14940
                val s = Metis_Set.delete s fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14941
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14942
                Or2 (forall_free fm, OrSet s)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14943
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14944
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14945
        | forall_free (Forall (fv,c,n,f)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14946
          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
 14947
        | forall_free fm = forall_gen fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14948
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14949
      forall init_fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14950
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14951
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14952
fun ForallList (vs,f) = List.foldl Forall1 f vs;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14953
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14954
fun ForallSet (n,f) = Metis_NameSet.foldl Forall1 f n;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14955
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14956
fun generalize f = ForallSet (freeVars f, f);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 14957
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14958
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14959
  fun subst_fv fvSub =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14960
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14961
        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
 14962
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14963
        Metis_NameSet.foldl add_fv Metis_NameSet.empty
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14964
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14965
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14966
  fun subst_rename (v,(avoid,bv,sub,domain,fvSub)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14967
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14968
        val v' = Metis_Term.variantPrime avoid v
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14969
        val avoid = Metis_NameSet.add avoid v'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14970
        val bv = Metis_NameSet.add bv v'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14971
        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
 14972
        val domain = Metis_NameSet.add domain v
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14973
        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
 14974
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14975
        (avoid,bv,sub,domain,fvSub)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14976
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14977
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14978
  fun subst_check sub domain fvSub fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14979
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14980
        val domain = Metis_NameSet.intersect domain (freeVars fm)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14981
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14982
        if Metis_NameSet.null domain then fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14983
        else subst_domain sub domain fvSub fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14984
      end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14985
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14986
  and subst_domain sub domain fvSub fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14987
      case fm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14988
        Metis_Literal (fv,lit) =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14989
        let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14990
          val fv = Metis_NameSet.difference fv domain
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14991
          val fv = Metis_NameSet.union fv (subst_fv fvSub domain)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14992
          val lit = Metis_Literal.subst sub lit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14993
        in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14994
          Metis_Literal (fv,lit)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14995
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14996
      | And (_,_,s) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14997
        AndList (Metis_Set.transform (subst_check sub domain fvSub) s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 14998
      | Or (_,_,s) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 14999
        OrList (Metis_Set.transform (subst_check sub domain fvSub) s)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15000
      | Xor (_,_,p,s) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15001
        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
 15002
      | 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
 15003
      | 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
 15004
      | _ => raise Bug "subst_domain"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15005
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15006
  and subst_quant quant sub domain fvSub (fv,c,bv,fm) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15007
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15008
        val sub_fv = subst_fv fvSub domain
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15009
        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
 15010
        val captured = Metis_NameSet.intersect bv sub_fv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15011
        val bv = Metis_NameSet.difference bv captured
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15012
        val avoid = Metis_NameSet.union fv bv
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15013
        val (_,bv,sub,domain,fvSub) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15014
            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
 15015
        val fm = subst_domain sub domain fvSub fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15016
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15017
        quant (fv,c,bv,fm)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15018
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15019
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15020
  fun subst sub =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15021
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15022
        fun mk_dom (v,tm,(d,fv)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15023
            (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
 15024
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15025
        val domain_fvSub = (Metis_NameSet.empty, Metis_NameMap.new ())
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15026
        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
 15027
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15028
        subst_check sub domain fvSub
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15029
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15030
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15031
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15032
fun fromFormula fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15033
    case fm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15034
      Metis_Formula.True => True
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15035
    | Metis_Formula.False => False
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15036
    | 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
 15037
    | Metis_Formula.Not p => negateFromFormula p
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15038
    | Metis_Formula.And (p,q) => And2 (fromFormula p, fromFormula q)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15039
    | Metis_Formula.Or (p,q) => Or2 (fromFormula p, fromFormula q)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15040
    | Metis_Formula.Imp (p,q) => Or2 (negateFromFormula p, fromFormula q)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15041
    | Metis_Formula.Iff (p,q) => Xor2 (negateFromFormula p, fromFormula q)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15042
    | Metis_Formula.Forall (v,p) => Forall1 (v, fromFormula p)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15043
    | Metis_Formula.Exists (v,p) => Exists1 (v, fromFormula p)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15044
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15045
and negateFromFormula fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15046
    case fm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15047
      Metis_Formula.True => False
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15048
    | Metis_Formula.False => True
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15049
    | 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
 15050
    | Metis_Formula.Not p => fromFormula p
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15051
    | Metis_Formula.And (p,q) => Or2 (negateFromFormula p, negateFromFormula q)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15052
    | Metis_Formula.Or (p,q) => And2 (negateFromFormula p, negateFromFormula q)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15053
    | Metis_Formula.Imp (p,q) => And2 (fromFormula p, negateFromFormula q)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15054
    | Metis_Formula.Iff (p,q) => Xor2 (fromFormula p, fromFormula q)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15055
    | Metis_Formula.Forall (v,p) => Exists1 (v, negateFromFormula p)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15056
    | Metis_Formula.Exists (v,p) => Forall1 (v, negateFromFormula p);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15057
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15058
local
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15059
  fun lastElt (s : formula Metis_Set.set) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15060
      case Metis_Set.findr (K true) s of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15061
        NONE => raise Bug "lastElt: empty set"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15062
      | SOME fm => fm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15063
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15064
  fun negateLastElt s =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15065
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15066
        val fm = lastElt s
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15067
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15068
        Metis_Set.add (Metis_Set.delete s fm) (negate fm)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15069
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15070
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15071
  fun form fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15072
      case fm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15073
        True => Metis_Formula.True
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15074
      | False => Metis_Formula.False
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15075
      | Metis_Literal (_,lit) => Metis_Literal.toFormula lit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15076
      | And (_,_,s) => Metis_Formula.listMkConj (Metis_Set.transform form s)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15077
      | Or (_,_,s) => Metis_Formula.listMkDisj (Metis_Set.transform form s)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 15078
      | Xor (_,_,p,s) => xorForm p s
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15079
      | Exists (_,_,n,f) => Metis_Formula.listMkExists (Metis_NameSet.toList n, form f)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 15080
      | Forall (_,_,n,f) => Metis_Formula.listMkForall (Metis_NameSet.toList n, form f)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 15081
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 15082
  (* To convert a Xor set to an Iff list we need to know   *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 15083
  (* whether the size of the set is even or odd:           *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 15084
  (*                                                       *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 15085
  (*                   b XOR a = b <=> ~a                  *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 15086
  (*             c XOR b XOR a = c <=> b <=> a             *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 15087
  (*       d XOR c XOR b XOR a = d <=> c <=> b <=> ~a      *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 15088
  (* e XOR d XOR c XOR b XOR a = e <=> d <=> c <=> b <=> a *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 15089
  and xorForm p s =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 15090
      let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 15091
        val p = if Metis_Set.size s mod 2 = 0 then not p else p
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 15092
        val s = if p then s else negateLastElt s
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 15093
      in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 15094
        Metis_Formula.listMkEquiv (Metis_Set.transform form s)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 15095
      end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15096
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15097
  val toFormula = form;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15098
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15099
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15100
fun toLiteral (Metis_Literal (_,lit)) = lit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15101
  | toLiteral _ = raise Error "Metis_Normalize.toLiteral";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15102
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15103
local
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15104
  fun addLiteral (l,s) = Metis_LiteralSet.add s (toLiteral l);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15105
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15106
  fun toClause False = Metis_LiteralSet.empty
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15107
    | 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
 15108
    | toClause l = Metis_LiteralSet.singleton (toLiteral l);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15109
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15110
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15111
val pp = Metis_Print.ppMap toFormula Metis_Formula.pp;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15112
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15113
val toString = Metis_Print.toString pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15114
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15115
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15116
(* Negation normal form.                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15117
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15118
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15119
fun nnf fm = toFormula (fromFormula fm);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15120
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15121
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15122
(* Basic conjunctive normal form.                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15123
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15124
39503
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15125
local
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15126
  val counter : int Metis_StringMap.map Unsynchronized.ref = Unsynchronized.ref (Metis_StringMap.new ());
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15127
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15128
  fun new n () =
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15129
      let
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15130
        val Unsynchronized.ref m = counter
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15131
        val s = Metis_Name.toString n
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15132
        val i = Option.getOpt (Metis_StringMap.peek m s, 0)
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15133
        val () = counter := Metis_StringMap.insert m (s, i + 1)
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15134
        val i = if i = 0 then "" else "_" ^ Int.toString i
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15135
        val s = skolemPrefix ^ "_" ^ s ^ i
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15136
      in
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15137
        Metis_Name.fromString s
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15138
      end;
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15139
in
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15140
  fun newSkolemFunction n = Metis_Portable.critical (new n) ();
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15141
end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15142
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15143
fun skolemize fv bv fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15144
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15145
      val fv = Metis_NameSet.transform Metis_Term.Var fv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15146
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15147
      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
 15148
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15149
      subst (Metis_NameSet.foldl mk Metis_Subst.empty bv) fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15150
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15151
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15152
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15153
  fun rename avoid fv bv fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15154
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15155
        val captured = Metis_NameSet.intersect avoid bv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15156
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15157
        if Metis_NameSet.null captured then fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15158
        else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15159
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15160
            fun ren (v,(a,s)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15161
                let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15162
                  val v' = Metis_Term.variantPrime a v
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15163
                in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15164
                  (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
 15165
                end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15166
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15167
            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
 15168
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15169
            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
 15170
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15171
            subst sub fm
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15172
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15173
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15174
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15175
  fun cnfFm avoid fm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15176
(*MetisTrace5
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15177
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15178
        val fm' = cnfFm' avoid fm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15179
        val () = Metis_Print.trace pp "Metis_Normalize.cnfFm: fm" fm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15180
        val () = Metis_Print.trace pp "Metis_Normalize.cnfFm: fm'" fm'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15181
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15182
        fm'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15183
      end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15184
  and cnfFm' avoid fm =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15185
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15186
      case fm of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15187
        True => True
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15188
      | False => False
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15189
      | Metis_Literal _ => fm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15190
      | 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
 15191
      | Or (fv,_,s) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15192
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15193
          val avoid = Metis_NameSet.union avoid fv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15194
          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
 15195
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15196
          pushOrList fms
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15197
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15198
      | Xor _ => cnfFm avoid (pushXor fm)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15199
      | 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
 15200
      | 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
 15201
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15202
  and cnfOr (fm,(fms,avoid)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15203
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15204
        val fm = cnfFm avoid fm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15205
        val fms = fm :: fms
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15206
        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
 15207
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15208
        (fms,avoid)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15209
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15210
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15211
  val basicCnf = cnfFm Metis_NameSet.empty;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15212
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15213
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15214
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15215
(* Finding the formula definition that minimizes the number of clauses.      *)
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15218
local
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15219
  type best = count * formula option;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15220
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15221
  fun minBreak countClauses fm best =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15222
      case fm of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15223
        True => best
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15224
      | False => best
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15225
      | Metis_Literal _ => best
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15226
      | And (_,_,s) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15227
        minBreakSet countClauses countAnd2 countTrue AndSet s best
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15228
      | Or (_,_,s) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15229
        minBreakSet countClauses countOr2 countFalse OrSet s best
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15230
      | Xor (_,_,_,s) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15231
        minBreakSet countClauses countXor2 countFalse XorSet s best
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15232
      | Exists (_,_,_,f) => minBreak countClauses f best
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15233
      | Forall (_,_,_,f) => minBreak countClauses f best
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15234
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15235
  and minBreakSet countClauses count2 count0 mkSet fmSet best =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15236
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15237
        fun cumulatives fms =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15238
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15239
              fun fwd (fm,(c1,s1,l)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15240
                  let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15241
                    val c1' = count2 (count fm, c1)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15242
                    and s1' = Metis_Set.add s1 fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15243
                  in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15244
                    (c1', s1', (c1,s1,fm) :: l)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15245
                  end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15246
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15247
              fun bwd ((c1,s1,fm),(c2,s2,l)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15248
                  let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15249
                    val c2' = count2 (count fm, c2)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15250
                    and s2' = Metis_Set.add s2 fm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15251
                  in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15252
                    (c2', s2', (c1,s1,fm,c2,s2) :: l)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15253
                  end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15254
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 15255
              val (c1,_,fms) = List.foldl fwd (count0,empty,[]) fms
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 15256
              val (c2,_,fms) = List.foldl bwd (count0,empty,[]) fms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15257
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15258
(*MetisDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15259
              val _ = countEquivish c1 c2 orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15260
                      raise Bug ("cumulativeCounts: c1 = " ^ countToString c1 ^
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15261
                                 ", c2 = " ^ countToString c2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15262
*)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15263
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15264
              fms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15265
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15266
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15267
        fun breakSing ((c1,_,fm,c2,_),best) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15268
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15269
              val cFms = count2 (c1,c2)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15270
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15271
              fun countCls cFm = countClauses (count2 (cFms,cFm))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15272
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15273
              minBreak countCls fm best
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15274
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15275
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15276
        val breakSet1 =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15277
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15278
              fun break c1 s1 fm c2 (best as (bcl,_)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15279
                  if Metis_Set.null s1 then best
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15280
                  else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15281
                    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15282
                      val cDef = countDefinition (countXor2 (c1, count fm))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15283
                      val cFm = count2 (countLiteral,c2)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15284
                      val cl = countAnd2 (cDef, countClauses cFm)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15285
                      val noBetter = countLeqish bcl cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15286
                    in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15287
                      if noBetter then best
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15288
                      else (cl, SOME (mkSet (Metis_Set.add s1 fm)))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15289
                    end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15290
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15291
              fn ((c1,s1,fm,c2,s2),best) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15292
                 break c1 s1 fm c2 (break c2 s2 fm c1 best)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15293
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15294
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15295
        val fms = Metis_Set.toList fmSet
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15296
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15297
        fun breakSet measure best =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15298
            let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15299
              val fms = sortMap (measure o count) countCompare fms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15300
            in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 15301
              List.foldl breakSet1 best (cumulatives fms)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 15302
            end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 15303
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 15304
        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
 15305
        val best = breakSet I best
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15306
        val best = breakSet countNegate best
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15307
        val best = breakSet countClauses best
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15308
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15309
        best
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15310
      end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15311
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15312
  fun minimumDefinition fm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15313
      let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15314
        val cl = count fm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15315
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15316
        if countLeqish cl countLiteral then NONE
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15317
        else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15318
          let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15319
            val (cl',def) = minBreak I fm (cl,NONE)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15320
(*MetisTrace1
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15321
            val () =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15322
                case def of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15323
                  NONE => ()
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15324
                | SOME d =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15325
                  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
 15326
                                  ", after = " ^ countToString cl' ^
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15327
                                  ", definition") d
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15328
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15329
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15330
            def
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15331
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15332
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15333
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15334
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15335
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15336
(* Conjunctive normal form derivations.                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15337
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15338
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15339
datatype thm = Metis_Thm of formula * inference
39351
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
and inference =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15342
    Axiom of Metis_Formula.formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15343
  | Definition of string * Metis_Formula.formula
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15344
  | Simplify of thm * thm list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15345
  | Conjunct of thm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15346
  | Specialize of thm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15347
  | Skolemize of thm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15348
  | Clausify of thm;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15349
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15350
fun parentsInference inf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15351
    case inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15352
      Axiom _ => []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15353
    | Definition _ => []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15354
    | Simplify (th,ths) => th :: ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15355
    | Conjunct th => [th]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15356
    | Specialize th => [th]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15357
    | Skolemize th => [th]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15358
    | Clausify th => [th];
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15359
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15360
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
 15361
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15362
fun parentsThm (Metis_Thm (_,inf)) = parentsInference inf;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15363
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15364
fun mkAxiom fm = Metis_Thm (fromFormula fm, Axiom fm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15365
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15366
fun destThm (Metis_Thm (fm,inf)) = (toFormula fm, inf);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15367
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15368
local
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15369
  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
 15370
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15371
  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
 15372
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15373
  fun isUnproved proved th = not (isProved proved th);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15374
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15375
  fun lookupProved proved th =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15376
      case Metis_Map.peek proved th of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15377
        SOME fm => fm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15378
      | NONE => raise Bug "Metis_Normalize.lookupProved";
39351
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
  fun prove acc proved ths =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15381
      case ths of
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 15382
        [] => List.rev acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15383
      | th :: ths' =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15384
        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
 15385
        else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15386
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15387
            val pars = parentsThm th
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 deps = List.filter (isUnproved proved) pars
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15390
          in
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 15391
            if List.null deps then
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15392
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15393
                val (fm,inf) = destThm th
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15394
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 15395
                val fms = List.map (lookupProved proved) pars
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15396
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15397
                val acc = (fm,inf,fms) :: acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15398
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15399
                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
 15400
              in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15401
                prove acc proved ths'
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15402
              end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15403
            else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15404
              let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15405
                val ths = deps @ ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15406
              in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15407
                prove acc proved ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15408
              end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15409
          end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15410
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15411
  val proveThms = prove [] emptyProved;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15412
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15413
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15414
fun toStringInference inf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15415
    case inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15416
      Axiom _ => "Axiom"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15417
    | Definition _ => "Definition"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15418
    | Simplify _ => "Simplify"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15419
    | Conjunct _ => "Conjunct"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15420
    | Specialize _ => "Specialize"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15421
    | Skolemize _ => "Skolemize"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15422
    | Clausify _ => "Clausify";
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15423
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15424
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
 15425
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15426
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15427
(* Simplifying with definitions.                                             *)
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15430
datatype simplify =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15431
    Simp of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15432
      {formula : (formula, formula * thm) Metis_Map.map,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15433
       andSet : (formula Metis_Set.set * formula * thm) list,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15434
       orSet : (formula Metis_Set.set * formula * thm) list,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15435
       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
 15436
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15437
val simplifyEmpty =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15438
    Simp
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15439
      {formula = Metis_Map.new compare,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15440
       andSet = [],
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15441
       orSet = [],
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15442
       xorSet = []};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15443
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15444
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15445
  fun simpler fm s =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15446
      Metis_Set.size s <> 1 orelse
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15447
      case Metis_Set.pick s of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15448
        True => false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15449
      | False => false
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15450
      | Metis_Literal _ => false
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15451
      | _ => true;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15452
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15453
  fun addSet set_defs body_def =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15454
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15455
        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
 15456
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15457
        val body_size = def_body_size body_def
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15458
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15459
        val (body,_,_) = body_def
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15460
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15461
        fun add acc [] = List.revAppend (acc,[body_def])
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15462
          | add acc (l as (bd as (b,_,_)) :: bds) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15463
            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
 15464
              LESS => List.revAppend (acc, body_def :: l)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15465
            | EQUAL =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15466
              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
 15467
              else add (bd :: acc) bds
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15468
            | GREATER => add (bd :: acc) bds
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15469
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15470
        add [] set_defs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15471
      end;
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
  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
 15474
    | add simp (True,_,_) = simp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15475
    | 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
 15476
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15477
        val andSet = addSet andSet (s,def,th)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15478
        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
 15479
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15480
        Simp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15481
          {formula = formula,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15482
           andSet = andSet,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15483
           orSet = orSet,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15484
           xorSet = xorSet}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15485
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15486
    | 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
 15487
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15488
        val orSet = addSet orSet (s,def,th)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15489
        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
 15490
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15491
        Simp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15492
          {formula = formula,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15493
           andSet = andSet,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15494
           orSet = orSet,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15495
           xorSet = xorSet}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15496
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15497
    | add simp (Xor (_,_,p,s), def, th) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15498
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15499
        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
 15500
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15501
        case def of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15502
          True =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15503
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15504
            fun addXorLiteral (fm as Metis_Literal _, simp) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15505
                let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15506
                  val s = Metis_Set.delete s fm
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15507
                in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15508
                  if not (simpler fm s) then simp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15509
                  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
 15510
                end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15511
              | addXorLiteral (_,simp) = simp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15512
          in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15513
            Metis_Set.foldl addXorLiteral simp s
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15514
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15515
        | _ => simp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15516
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15517
    | 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
 15518
      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
 15519
      else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15520
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15521
          val formula = Metis_Map.insert formula (body,(def,th))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15522
          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
 15523
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15524
          Simp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15525
            {formula = formula,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15526
             andSet = andSet,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15527
             orSet = orSet,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15528
             xorSet = xorSet}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15529
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15530
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15531
  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
 15532
      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
 15533
      else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15534
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15535
          val xorSet = addSet xorSet (s,def,th)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15536
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15537
          Simp
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15538
            {formula = formula,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15539
             andSet = andSet,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15540
             orSet = orSet,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15541
             xorSet = xorSet}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15542
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15543
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15544
  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
 15545
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15546
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15547
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15548
  fun simplifySet set_defs set =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15549
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15550
        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
 15551
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15552
        case List.find pred set_defs of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15553
          NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15554
        | SOME (s,f,th) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15555
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15556
            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
 15557
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15558
            SOME (set,th)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15559
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15560
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15561
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15562
  fun simplify (Simp {formula,andSet,orSet,xorSet}) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15563
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15564
        fun simp fm inf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15565
            case simp_sub fm inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15566
              NONE => simp_top fm inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15567
            | SOME (fm,inf) => try_simp_top fm inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15568
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15569
        and try_simp_top fm inf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15570
            case simp_top fm inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15571
              NONE => SOME (fm,inf)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15572
            | x => x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15573
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15574
        and simp_top fm inf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15575
            case fm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15576
              And (_,_,s) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15577
              (case simplifySet andSet s of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15578
                 NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15579
               | SOME (s,th) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15580
                 let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15581
                   val fm = AndSet s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15582
                   val inf = th :: inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15583
                 in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15584
                   try_simp_top fm inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15585
                 end)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15586
            | Or (_,_,s) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15587
              (case simplifySet orSet s of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15588
                 NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15589
               | SOME (s,th) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15590
                 let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15591
                   val fm = OrSet s
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15592
                   val inf = th :: inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15593
                 in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15594
                   try_simp_top fm inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15595
                 end)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15596
            | Xor (_,_,p,s) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15597
              (case simplifySet xorSet s of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15598
                 NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15599
               | SOME (s,th) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15600
                 let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15601
                   val fm = XorPolaritySet (p,s)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15602
                   val inf = th :: inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15603
                 in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15604
                   try_simp_top fm inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15605
                 end)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15606
            | _ =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15607
              (case Metis_Map.peek formula fm of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15608
                 NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15609
               | SOME (fm,th) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15610
                 let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15611
                   val inf = th :: inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15612
                 in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15613
                   try_simp_top fm inf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15614
                 end)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15615
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15616
        and simp_sub fm inf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15617
            case fm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15618
              And (_,_,s) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15619
              (case simp_set s inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15620
                 NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15621
               | SOME (l,inf) => SOME (AndList l, inf))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15622
            | Or (_,_,s) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15623
              (case simp_set s inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15624
                 NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15625
               | SOME (l,inf) => SOME (OrList l, inf))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15626
            | Xor (_,_,p,s) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15627
              (case simp_set s inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15628
                 NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15629
               | SOME (l,inf) => SOME (XorPolarityList (p,l), inf))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15630
            | Exists (_,_,n,f) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15631
              (case simp f inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15632
                 NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15633
               | SOME (f,inf) => SOME (ExistsSet (n,f), inf))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15634
            | Forall (_,_,n,f) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15635
              (case simp f inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15636
                 NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15637
               | SOME (f,inf) => SOME (ForallSet (n,f), inf))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15638
            | _ => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15639
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15640
        and simp_set s inf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15641
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15642
              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
 15643
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15644
              if changed then SOME (l,inf) else NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15645
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15646
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15647
        and simp_set_elt (fm,(changed,l,inf)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15648
            case simp fm inf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15649
              NONE => (changed, fm :: l, inf)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15650
            | SOME (fm,inf) => (true, fm :: l, inf)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15651
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15652
        fn th as Metis_Thm (fm,_) =>
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15653
           case simp fm [] of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15654
             SOME (fm,ths) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15655
             let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15656
               val inf = Simplify (th,ths)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15657
             in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15658
               Metis_Thm (fm,inf)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15659
             end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15660
           | NONE => th
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15661
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15662
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15663
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15664
(*MetisTrace2
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15665
val simplify = fn simp => fn th as Metis_Thm (fm,_) =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15666
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15667
      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
 15668
      val () = if compare (fm,fm') = EQUAL then ()
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15669
               else (Metis_Print.trace pp "Metis_Normalize.simplify: fm" fm;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15670
                     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
 15671
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15672
      th'
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15673
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15674
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15675
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15676
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15677
(* Definitions.                                                              *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15678
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15679
39503
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15680
local
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15681
  val counter : int Unsynchronized.ref = Unsynchronized.ref 0;
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15682
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15683
  fun new () =
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15684
      let
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15685
        val Unsynchronized.ref i = counter
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15686
        val () = counter := i + 1
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15687
      in
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15688
        definitionPrefix ^ "_" ^ Int.toString i
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15689
      end;
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15690
in
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15691
  fun newDefinitionRelation () = Metis_Portable.critical new ();
b7ff4b15be13 regenerate "metis.ML"
blanchet
parents: 39449
diff changeset
 15692
end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15693
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15694
fun newDefinition def =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15695
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15696
      val fv = freeVars def
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15697
      val rel = newDefinitionRelation ()
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15698
      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
 15699
      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
 15700
      val fm = Metis_Formula.setMkForall (fv,fm)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15701
      val inf = Definition (rel,fm)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15702
      val lit = Metis_Literal (fv,(false,atm))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15703
      val fm = Xor2 (lit,def)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15704
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15705
      Metis_Thm (fm,inf)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15706
    end;
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
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15709
(* Definitional conjunctive normal form.                                     *)
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15712
datatype cnf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15713
    ConsistentCnf of simplify
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15714
  | InconsistentCnf;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15715
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15716
val initialCnf = ConsistentCnf simplifyEmpty;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15717
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15718
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15719
  fun def_cnf_inconsistent th =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15720
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15721
        val cls = [(Metis_LiteralSet.empty,th)]
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15722
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15723
        (cls,InconsistentCnf)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15724
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15725
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15726
  fun def_cnf_clause inf (fm,acc) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15727
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15728
        val cl = toClause fm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15729
        val th = Metis_Thm (fm,inf)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15730
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15731
        (cl,th) :: acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15732
      end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15733
(*MetisDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15734
      handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15735
        (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
 15736
         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
 15737
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15738
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15739
  fun def_cnf cls simp ths =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15740
      case ths of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15741
        [] => (cls, ConsistentCnf simp)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15742
      | 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
 15743
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15744
  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
 15745
      case fm of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15746
        True => def_cnf cls simp ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15747
      | False => def_cnf_inconsistent th
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15748
      | And (_,_,s) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15749
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15750
          fun add (f,z) = Metis_Thm (f, Conjunct th) :: z
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15751
        in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15752
          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
 15753
        end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15754
      | Exists (fv,_,n,f) =>
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15755
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15756
          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
 15757
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15758
          def_cnf_formula cls simp th ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15759
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15760
      | Forall (_,_,_,f) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15761
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15762
          val th = Metis_Thm (f, Specialize th)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15763
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15764
          def_cnf_formula cls simp th ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15765
        end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15766
      | _ =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15767
        case minimumDefinition fm of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15768
          SOME def =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15769
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15770
            val ths = th :: ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15771
            val th = newDefinition def
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15772
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15773
            def_cnf_formula cls simp th ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15774
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15775
        | NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15776
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15777
            val simp = simplifyAdd simp th
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15778
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15779
            val fm = basicCnf fm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15780
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15781
            val inf = Clausify th
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15782
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15783
            case fm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15784
              True => def_cnf cls simp ths
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15785
            | 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
 15786
            | And (_,_,s) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15787
              let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15788
                val inf = Conjunct (Metis_Thm (fm,inf))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15789
                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
 15790
              in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15791
                def_cnf cls simp ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15792
              end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15793
            | 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
 15794
          end;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15795
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15796
  fun addCnf th cnf =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15797
      case cnf of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15798
        ConsistentCnf simp => def_cnf [] simp [th]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15799
      | InconsistentCnf => ([],cnf);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15800
end;
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
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15803
  fun add (th,(cls,cnf)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15804
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15805
        val (cls',cnf) = addCnf th cnf
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15806
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15807
        (cls' @ cls, cnf)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15808
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15809
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15810
  fun proveCnf ths =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15811
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15812
        val (cls,_) = List.foldl add ([],initialCnf) ths
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15813
      in
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 15814
        List.rev cls
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15815
      end;
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 cnf fm =
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 cls = proveCnf [mkAxiom fm]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15821
    in
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 15822
      List.map fst cls
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15823
    end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15824
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15825
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15826
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 15827
(**** Original file: src/Model.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15828
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15829
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15830
(* RANDOM FINITE MODELS                                                      *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 15831
(* Copyright (c) 2003 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15832
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15833
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15834
signature Metis_Model =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15835
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15836
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15837
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15838
(* Metis_Model size.                                                               *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15839
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15840
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15841
type size = {size : int}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15842
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15843
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15844
(* 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
 15845
(* ------------------------------------------------------------------------- *)
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
type element = int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15848
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15849
val zeroElement : element
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15850
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15851
val incrementElement : size -> element -> element option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15852
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15853
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 15854
(* 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
 15855
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15856
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15857
type fixedFunction = size -> element list -> element option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15858
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15859
type fixedRelation = size -> element list -> bool option
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15860
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15861
datatype fixed =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15862
    Fixed of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15863
      {functions : fixedFunction Metis_NameArityMap.map,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15864
       relations : fixedRelation Metis_NameArityMap.map}
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15865
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15866
val emptyFixed : fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15867
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15868
val unionFixed : fixed -> fixed -> fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15869
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15870
val getFunctionFixed : fixed -> Metis_NameArity.nameArity -> fixedFunction
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15871
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15872
val getRelationFixed : fixed -> Metis_NameArity.nameArity -> fixedRelation
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15873
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15874
val insertFunctionFixed : fixed -> Metis_NameArity.nameArity * fixedFunction -> fixed
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15875
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15876
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
 15877
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15878
val unionListFixed : fixed list -> fixed
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
val basicFixed : fixed  (* interprets equality and hasType *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15881
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15882
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15883
(* Renaming fixed model parts.                                               *)
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15886
type fixedMap =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15887
     {functionMap : Metis_Name.name Metis_NameArityMap.map,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15888
      relationMap : Metis_Name.name Metis_NameArityMap.map}
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15889
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15890
val mapFixed : fixedMap -> fixed -> fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15891
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15892
val ppFixedMap : fixedMap Metis_Print.pp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15893
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15894
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15895
(* Standard fixed model parts.                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15896
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15897
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15898
(* Projections *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15899
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15900
val projectionMin : int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15901
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15902
val projectionMax : int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15903
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15904
val projectionName : int -> Metis_Name.name
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15905
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15906
val projectionFixed : fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15907
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15908
(* Arithmetic *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15909
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15910
val numeralMin : int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15911
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15912
val numeralMax : int
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15913
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15914
val numeralName : int -> Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15915
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15916
val addName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15917
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15918
val divName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15919
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15920
val dividesName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15921
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15922
val evenName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15923
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15924
val expName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15925
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15926
val geName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15927
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15928
val gtName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15929
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15930
val isZeroName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15931
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15932
val leName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15933
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15934
val ltName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15935
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15936
val modName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15937
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15938
val multName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15939
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15940
val negName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15941
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15942
val oddName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15943
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15944
val preName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15945
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15946
val subName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15947
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15948
val sucName : Metis_Name.name
39351
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
val modularFixed : fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15951
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15952
val overflowFixed : fixed
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
(* Sets *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15955
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15956
val cardName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15957
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15958
val complementName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15959
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15960
val differenceName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15961
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15962
val emptyName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15963
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15964
val memberName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15965
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15966
val insertName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15967
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15968
val intersectName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15969
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15970
val singletonName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15971
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15972
val subsetName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15973
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15974
val symmetricDifferenceName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15975
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15976
val unionName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15977
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15978
val universeName : Metis_Name.name
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15979
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15980
val setFixed : fixed
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
(* Lists *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15983
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15984
val appendName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15985
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15986
val consName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15987
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15988
val lengthName : Metis_Name.name
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 nilName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15991
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15992
val nullName : Metis_Name.name
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15993
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 15994
val tailName : Metis_Name.name
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15995
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15996
val listFixed : fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15997
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15998
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 15999
(* Valuations.                                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16000
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16001
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16002
type valuation
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16003
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16004
val emptyValuation : valuation
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16005
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16006
val zeroValuation : Metis_NameSet.set -> valuation
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16007
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16008
val constantValuation : element -> Metis_NameSet.set -> valuation
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16009
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16010
val peekValuation : valuation -> Metis_Name.name -> element option
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16011
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16012
val getValuation : valuation -> Metis_Name.name -> element
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16013
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16014
val insertValuation : valuation -> Metis_Name.name * element -> valuation
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16015
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16016
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
 16017
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16018
val incrementValuation :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16019
    {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
 16020
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16021
val foldValuation :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16022
    {size : int} -> Metis_NameSet.set -> (valuation * 'a -> 'a) -> 'a -> 'a
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16023
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16024
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16025
(* A type of random finite models.                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16026
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16027
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16028
type parameters = {size : int, fixed : fixed}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16029
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16030
type model
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16031
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16032
val default : parameters
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16033
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16034
val new : parameters -> model
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16035
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16036
val size : model -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16037
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16038
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16039
(* Interpreting terms and formulas in the model.                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16040
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16041
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16042
val interpretFunction : model -> Metis_Term.functionName * element list -> element
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16043
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16044
val interpretRelation : model -> Metis_Atom.relationName * element list -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16045
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16046
val interpretTerm : model -> valuation -> Metis_Term.term -> element
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16047
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16048
val interpretAtom : model -> valuation -> Metis_Atom.atom -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16049
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16050
val interpretFormula : model -> valuation -> Metis_Formula.formula -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16051
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16052
val interpretLiteral : model -> valuation -> Metis_Literal.literal -> bool
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16053
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16054
val interpretClause : model -> valuation -> Metis_Thm.clause -> bool
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16055
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16056
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16057
(* 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
 16058
(* 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
 16059
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16060
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16061
val check :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16062
    (model -> valuation -> 'a -> bool) -> {maxChecks : int option} -> model ->
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16063
    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
 16064
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16065
val checkAtom :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16066
    {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
 16067
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16068
val checkFormula :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16069
    {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
 16070
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16071
val checkLiteral :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16072
    {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
 16073
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16074
val checkClause :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16075
    {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
 16076
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16077
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16078
(* Updating the model.                                                       *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16079
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16080
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16081
val updateFunction :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16082
    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
 16083
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16084
val updateRelation :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16085
    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
 16086
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16087
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16088
(* 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
 16089
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16090
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16091
val perturbTerm : model -> valuation -> Metis_Term.term * element list -> unit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16092
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16093
val perturbAtom : model -> valuation -> Metis_Atom.atom * bool -> unit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16094
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16095
val perturbLiteral : model -> valuation -> Metis_Literal.literal -> unit
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16096
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16097
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
 16098
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
(* Pretty printing.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16101
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16102
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16103
val pp : model Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16104
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16105
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16106
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 16107
(**** Original file: src/Model.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16108
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16109
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16110
(* RANDOM FINITE MODELS                                                      *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 16111
(* Copyright (c) 2003 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16112
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16113
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16114
structure Metis_Model :> Metis_Model =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16115
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16116
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16117
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16118
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16119
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16120
(* Constants.                                                                *)
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16123
val maxSpace = 1000;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16124
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16125
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16126
(* Helper functions.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16127
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16128
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16129
val multInt =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16130
    case Int.maxInt of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16131
      NONE => (fn x => fn y => SOME (x * y))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16132
    | SOME m =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16133
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16134
        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
 16135
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16136
        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
 16137
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16138
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16139
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16140
  fun iexp x y acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16141
      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
 16142
      else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16143
        case multInt acc x of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16144
          SOME acc => iexp' x y acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16145
        | NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16146
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16147
  and iexp' x y acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16148
      if y = 1 then SOME acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16149
      else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16150
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16151
          val y = y div 2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16152
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16153
          case multInt x x of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16154
            SOME x => iexp x y acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16155
          | NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16156
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16157
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16158
  fun expInt x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16159
      if y <= 1 then
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16160
        if y = 0 then SOME 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16161
        else if y = 1 then SOME x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16162
        else raise Bug "expInt: negative exponent"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16163
      else if x <= 1 then
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16164
        if 0 <= x then SOME x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16165
        else raise Bug "expInt: negative exponand"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16166
      else iexp x y 1;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16167
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16168
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16169
fun boolToInt true = 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16170
  | boolToInt false = 0;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16171
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16172
fun intToBool 1 = true
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16173
  | intToBool 0 = false
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16174
  | intToBool _ = raise Bug "Metis_Model.intToBool";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16175
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16176
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
 16177
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16178
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16179
(* Metis_Model size.                                                               *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16180
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16181
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16182
type size = {size : int};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16183
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16184
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16185
(* 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
 16186
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16187
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16188
type element = int;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16189
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16190
val zeroElement = 0;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16191
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16192
fun incrementElement {size = N} i =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16193
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16194
      val i = i + 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16195
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16196
      if i = N then NONE else SOME i
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
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16199
fun elementListSpace {size = N} arity =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16200
    case expInt N arity of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16201
      NONE => NONE
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16202
    | 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
 16203
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16204
fun elementListIndex {size = N} =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16205
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16206
      fun f acc elts =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16207
          case elts of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16208
            [] => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16209
          | elt :: elts => f (N * acc + elt) elts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16210
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16211
      f 0
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16212
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16213
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16214
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 16215
(* 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
 16216
(* ------------------------------------------------------------------------- *)
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
type fixedFunction = size -> element list -> element option;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16219
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16220
type fixedRelation = size -> element list -> bool option;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16221
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16222
datatype fixed =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16223
    Fixed of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16224
      {functions : fixedFunction Metis_NameArityMap.map,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16225
       relations : fixedRelation Metis_NameArityMap.map};
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16226
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16227
val uselessFixedFunction : fixedFunction = K (K NONE);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16228
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16229
val uselessFixedRelation : fixedRelation = K (K NONE);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16230
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16231
val emptyFunctions : fixedFunction Metis_NameArityMap.map = Metis_NameArityMap.new ();
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16232
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16233
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
 16234
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16235
fun fixed0 f sz elts =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16236
    case elts of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16237
      [] => f sz
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16238
    | _ => raise Bug "Metis_Model.fixed0: wrong arity";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16239
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16240
fun fixed1 f sz elts =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16241
    case elts of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16242
      [x] => f sz x
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16243
    | _ => raise Bug "Metis_Model.fixed1: wrong arity";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16244
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16245
fun fixed2 f sz elts =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16246
    case elts of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16247
      [x,y] => f sz x y
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16248
    | _ => raise Bug "Metis_Model.fixed2: wrong arity";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16249
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16250
val emptyFixed =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16251
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16252
      val fns = emptyFunctions
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16253
      and rels = emptyRelations
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16254
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16255
      Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16256
        {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16257
         relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16258
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16259
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16260
fun peekFunctionFixed fix name_arity =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16261
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16262
      val Fixed {functions = fns, ...} = fix
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16263
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16264
      Metis_NameArityMap.peek fns name_arity
39351
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 peekRelationFixed fix name_arity =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16268
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16269
      val Fixed {relations = rels, ...} = fix
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16270
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16271
      Metis_NameArityMap.peek rels name_arity
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16272
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16273
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16274
fun getFunctionFixed fix name_arity =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16275
    case peekFunctionFixed fix name_arity of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16276
      SOME f => f
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16277
    | NONE => uselessFixedFunction;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16278
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16279
fun getRelationFixed fix name_arity =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16280
    case peekRelationFixed fix name_arity of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16281
      SOME rel => rel
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16282
    | NONE => uselessFixedRelation;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16283
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16284
fun insertFunctionFixed fix name_arity_fn =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16285
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16286
      val Fixed {functions = fns, relations = rels} = fix
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16287
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16288
      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
 16289
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16290
      Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16291
        {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16292
         relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16293
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16294
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16295
fun insertRelationFixed fix name_arity_rel =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16296
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16297
      val Fixed {functions = fns, relations = rels} = fix
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16298
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16299
      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
 16300
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16301
      Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16302
        {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16303
         relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16304
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16305
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16306
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16307
  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
 16308
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16309
  fun unionFixed fix1 fix2 =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16310
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16311
        val Fixed {functions = fns1, relations = rels1} = fix1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16312
        and Fixed {functions = fns2, relations = rels2} = fix2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16313
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16314
        val fns = Metis_NameArityMap.union union fns1 fns2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16315
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16316
        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
 16317
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16318
        Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16319
          {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16320
           relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16321
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16322
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16323
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16324
val unionListFixed =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16325
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16326
      fun union (fix,acc) = unionFixed acc fix
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
      List.foldl union emptyFixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16329
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16330
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16331
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16332
  fun hasTypeFn _ elts =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16333
      case elts of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16334
        [x,_] => SOME x
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16335
      | _ => raise Bug "Metis_Model.hasTypeFn: wrong arity";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16336
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16337
  fun eqRel _ elts =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16338
      case elts of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16339
        [x,y] => SOME (x = y)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16340
      | _ => raise Bug "Metis_Model.eqRel: wrong arity";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16341
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16342
  val basicFixed =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16343
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16344
        val fns = Metis_NameArityMap.singleton (Metis_Term.hasTypeFunction,hasTypeFn)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16345
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16346
        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
 16347
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16348
        Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16349
          {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16350
           relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16351
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16352
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16353
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
(* Renaming fixed model parts.                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16356
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16357
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16358
type fixedMap =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16359
     {functionMap : Metis_Name.name Metis_NameArityMap.map,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16360
      relationMap : Metis_Name.name Metis_NameArityMap.map};
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16361
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16362
fun mapFixed fixMap fix =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16363
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16364
      val {functionMap = fnMap, relationMap = relMap} = fixMap
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16365
      and Fixed {functions = fns, relations = rels} = fix
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16366
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16367
      val fns = Metis_NameArityMap.compose fnMap fns
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16368
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16369
      val rels = Metis_NameArityMap.compose relMap rels
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16370
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16371
      Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16372
        {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16373
         relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16374
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16375
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16376
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16377
  fun mkEntry tag (na,n) = (tag,na,n);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16378
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 16379
  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
 16380
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16381
  fun ppEntry (tag,source_arity,target) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 16382
      Metis_Print.inconsistentBlock 2
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 16383
        [Metis_Print.ppString tag,
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 16384
         Metis_Print.break,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16385
         Metis_NameArity.pp source_arity,
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 16386
         Metis_Print.ppString " ->",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 16387
         Metis_Print.break,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16388
         Metis_Name.pp target];
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16389
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16390
  fun ppFixedMap fixMap =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16391
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16392
        val {functionMap = fnMap, relationMap = relMap} = fixMap
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16393
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16394
        case mkList "function" fnMap @ mkList "relation" relMap of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16395
          [] => Metis_Print.skip
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16396
        | entry :: entries =>
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 16397
          Metis_Print.consistentBlock 0
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16398
            (ppEntry entry ::
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 16399
             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
 16400
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16401
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16402
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16403
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16404
(* Standard fixed model parts.                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16405
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16406
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16407
(* Projections *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16408
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16409
val projectionMin = 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16410
and projectionMax = 9;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16411
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16412
val projectionList = minMaxInterval projectionMin projectionMax;
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
fun projectionName i =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16415
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16416
      val _ = projectionMin <= i orelse
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16417
              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
 16418
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16419
      val _ = i <= projectionMax orelse
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16420
              raise Bug "Metis_Model.projectionName: greater than projectionMax"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16421
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16422
      Metis_Name.fromString ("project" ^ Int.toString i)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16423
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16424
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16425
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
 16426
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16427
fun arityProjectionFixed arity =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16428
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16429
      fun mkProj i = ((projectionName i, arity), projectionFn i)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16430
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16431
      fun addProj i acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16432
          if i > arity then acc
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16433
          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
 16434
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16435
      val fns = addProj projectionMin emptyFunctions
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16436
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16437
      val rels = emptyRelations
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16438
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16439
      Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16440
        {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16441
         relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16442
    end;
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 projectionFixed =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 16445
    unionListFixed (List.map arityProjectionFixed projectionList);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16446
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16447
(* Arithmetic *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16448
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16449
val numeralMin = ~100
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16450
and numeralMax = 100;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16451
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16452
val numeralList = minMaxInterval numeralMin numeralMax;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16453
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16454
fun numeralName i =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16455
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16456
      val _ = numeralMin <= i orelse
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16457
              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
 16458
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16459
      val _ = i <= numeralMax orelse
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16460
              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
 16461
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16462
      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
 16463
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16464
      Metis_Name.fromString s
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16465
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16466
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16467
val addName = Metis_Name.fromString "+"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16468
and divName = Metis_Name.fromString "div"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16469
and dividesName = Metis_Name.fromString "divides"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16470
and evenName = Metis_Name.fromString "even"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16471
and expName = Metis_Name.fromString "exp"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16472
and geName = Metis_Name.fromString ">="
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16473
and gtName = Metis_Name.fromString ">"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16474
and isZeroName = Metis_Name.fromString "isZero"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16475
and leName = Metis_Name.fromString "<="
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16476
and ltName = Metis_Name.fromString "<"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16477
and modName = Metis_Name.fromString "mod"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16478
and multName = Metis_Name.fromString "*"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16479
and negName = Metis_Name.fromString "~"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16480
and oddName = Metis_Name.fromString "odd"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16481
and preName = Metis_Name.fromString "pre"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16482
and subName = Metis_Name.fromString "-"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16483
and sucName = Metis_Name.fromString "suc";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16484
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16485
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16486
  (* Support *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16487
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16488
  fun modN {size = N} x = x mod N;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16489
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16490
  fun oneN sz = modN sz 1;
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
  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
 16493
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16494
  (* Functions *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16495
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16496
  fun numeralFn i sz = SOME (modN sz i);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16497
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16498
  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
 16499
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16500
  fun divFn {size = N} x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16501
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16502
        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
 16503
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16504
        SOME (x div y)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16505
      end;
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 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
 16508
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16509
  fun modFn {size = N} x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16510
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16511
        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
 16512
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16513
        SOME (x mod y)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16514
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16515
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16516
  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
 16517
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16518
  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
 16519
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16520
  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
 16521
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16522
  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
 16523
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16524
  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
 16525
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16526
  (* Relations *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16527
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16528
  fun dividesRel _ x y = SOME (divides x y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16529
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16530
  fun evenRel _ x = SOME (x mod 2 = 0);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16531
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16532
  fun geRel _ x y = SOME (x >= y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16533
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16534
  fun gtRel _ x y = SOME (x > y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16535
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16536
  fun isZeroRel _ x = SOME (x = 0);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16537
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16538
  fun leRel _ x y = SOME (x <= y);
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 ltRel _ x y = SOME (x < y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16541
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16542
  fun oddRel _ x = SOME (x mod 2 = 1);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16543
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16544
  val modularFixed =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16545
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16546
        val fns =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16547
            Metis_NameArityMap.fromList
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 16548
              (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
 16549
                 numeralList @
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16550
               [((addName,2), fixed2 addFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16551
                ((divName,2), fixed2 divFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16552
                ((expName,2), fixed2 expFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16553
                ((modName,2), fixed2 modFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16554
                ((multName,2), fixed2 multFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16555
                ((negName,1), fixed1 negFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16556
                ((preName,1), fixed1 preFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16557
                ((subName,2), fixed2 subFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16558
                ((sucName,1), fixed1 sucFn)])
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16559
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16560
        val rels =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16561
            Metis_NameArityMap.fromList
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16562
              [((dividesName,2), fixed2 dividesRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16563
               ((evenName,1), fixed1 evenRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16564
               ((geName,2), fixed2 geRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16565
               ((gtName,2), fixed2 gtRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16566
               ((isZeroName,1), fixed1 isZeroRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16567
               ((leName,2), fixed2 leRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16568
               ((ltName,2), fixed2 ltRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16569
               ((oddName,1), fixed1 oddRel)]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16570
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16571
        Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16572
          {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16573
           relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16574
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16575
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16576
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16577
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16578
  (* Support *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16579
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16580
  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
 16581
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16582
  fun oneN sz = cutN sz 1;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16583
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16584
  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
 16585
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16586
  (* Functions *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16587
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16588
  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
 16589
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16590
  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
 16591
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16592
  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
 16593
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16594
  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
 16595
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16596
  fun modFn {size = N} x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16597
      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
 16598
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16599
  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
 16600
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16601
  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
 16602
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16603
  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
 16604
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16605
  fun subFn {size = N} x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16606
      if y = 0 then SOME x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16607
      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
 16608
      else SOME (x - y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16609
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16610
  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
 16611
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16612
  (* Relations *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16613
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16614
  fun dividesRel {size = N} x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16615
      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
 16616
      else if x = 0 then SOME false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16617
      else if y = N - 1 then NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16618
      else SOME (divides x y);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16619
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16620
  fun evenRel {size = N} x =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16621
      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
 16622
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16623
  fun geRel {size = N} y x =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16624
      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
 16625
      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
 16626
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16627
  fun gtRel {size = N} y x =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16628
      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
 16629
      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
 16630
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16631
  fun isZeroRel _ x = SOME (x = 0);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16632
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16633
  fun leRel {size = N} x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16634
      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
 16635
      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
 16636
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16637
  fun ltRel {size = N} x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16638
      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
 16639
      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
 16640
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16641
  fun oddRel {size = N} x =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16642
      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
 16643
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16644
  val overflowFixed =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16645
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16646
        val fns =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16647
            Metis_NameArityMap.fromList
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 16648
              (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
 16649
                 numeralList @
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16650
               [((addName,2), fixed2 addFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16651
                ((divName,2), fixed2 divFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16652
                ((expName,2), fixed2 expFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16653
                ((modName,2), fixed2 modFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16654
                ((multName,2), fixed2 multFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16655
                ((negName,1), fixed1 negFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16656
                ((preName,1), fixed1 preFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16657
                ((subName,2), fixed2 subFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16658
                ((sucName,1), fixed1 sucFn)])
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16659
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16660
        val rels =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16661
            Metis_NameArityMap.fromList
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16662
              [((dividesName,2), fixed2 dividesRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16663
               ((evenName,1), fixed1 evenRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16664
               ((geName,2), fixed2 geRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16665
               ((gtName,2), fixed2 gtRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16666
               ((isZeroName,1), fixed1 isZeroRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16667
               ((leName,2), fixed2 leRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16668
               ((ltName,2), fixed2 ltRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16669
               ((oddName,1), fixed1 oddRel)]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16670
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16671
        Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16672
          {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16673
           relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16674
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16675
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16676
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16677
(* Sets *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16678
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16679
val cardName = Metis_Name.fromString "card"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16680
and complementName = Metis_Name.fromString "complement"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16681
and differenceName = Metis_Name.fromString "difference"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16682
and emptyName = Metis_Name.fromString "empty"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16683
and memberName = Metis_Name.fromString "member"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16684
and insertName = Metis_Name.fromString "insert"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16685
and intersectName = Metis_Name.fromString "intersect"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16686
and singletonName = Metis_Name.fromString "singleton"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16687
and subsetName = Metis_Name.fromString "subset"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16688
and symmetricDifferenceName = Metis_Name.fromString "symmetricDifference"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16689
and unionName = Metis_Name.fromString "union"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16690
and universeName = Metis_Name.fromString "universe";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16691
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16692
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16693
  (* Support *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16694
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16695
  fun eltN {size = N} =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16696
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16697
        fun f 0 acc = acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16698
          | 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
 16699
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16700
        f N ~1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16701
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16702
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16703
  fun posN i = Word.<< (0w1, Word.fromInt i);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16704
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16705
  fun univN sz = Word.- (posN (eltN sz), 0w1);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16706
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16707
  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
 16708
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16709
  (* Functions *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16710
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16711
  fun cardFn sz x =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16712
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16713
        fun f 0w0 acc = acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16714
          | f s acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16715
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16716
              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
 16717
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16718
              f (Word.>> (s,0w1)) acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16719
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16720
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16721
        SOME (f (setN sz x) 0)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16722
      end;
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
  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
 16725
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16726
  fun differenceFn sz x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16727
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16728
        val x = setN sz x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16729
        and y = setN sz y
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16730
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16731
        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
 16732
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16733
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16734
  fun emptyFn _ = SOME 0;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16735
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16736
  fun insertFn sz x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16737
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16738
        val x = x mod eltN sz
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16739
        and y = setN sz y
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16740
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16741
        SOME (Word.toInt (Word.orb (posN x, y)))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16742
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16743
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16744
  fun intersectFn sz x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16745
      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
 16746
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16747
  fun singletonFn sz x =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16748
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16749
        val x = x mod eltN sz
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16750
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16751
        SOME (Word.toInt (posN x))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16752
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16753
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16754
  fun symmetricDifferenceFn sz x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16755
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16756
        val x = setN sz x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16757
        and y = setN sz y
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
        SOME (Word.toInt (Word.xorb (x,y)))
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 unionFn sz x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16763
      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
 16764
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16765
  fun universeFn sz = SOME (Word.toInt (univN sz));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16766
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16767
  (* Relations *)
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
  fun memberRel sz x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16770
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16771
        val x = x mod eltN sz
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16772
        and y = setN sz y
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16773
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16774
        SOME (Word.andb (posN x, y) <> 0w0)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16775
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16776
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16777
  fun subsetRel sz x y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16778
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16779
        val x = setN sz x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16780
        and y = setN sz y
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16781
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16782
        SOME (Word.andb (x, Word.notb y) = 0w0)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16783
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16784
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16785
  val setFixed =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16786
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16787
        val fns =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16788
            Metis_NameArityMap.fromList
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16789
              [((cardName,1), fixed1 cardFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16790
               ((complementName,1), fixed1 complementFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16791
               ((differenceName,2), fixed2 differenceFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16792
               ((emptyName,0), fixed0 emptyFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16793
               ((insertName,2), fixed2 insertFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16794
               ((intersectName,2), fixed2 intersectFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16795
               ((singletonName,1), fixed1 singletonFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16796
               ((symmetricDifferenceName,2), fixed2 symmetricDifferenceFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16797
               ((unionName,2), fixed2 unionFn),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16798
               ((universeName,0), fixed0 universeFn)]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16799
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16800
        val rels =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16801
            Metis_NameArityMap.fromList
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16802
              [((memberName,2), fixed2 memberRel),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16803
               ((subsetName,2), fixed2 subsetRel)]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16804
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16805
        Fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16806
          {functions = fns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16807
           relations = rels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16808
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16809
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16810
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16811
(* Lists *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16812
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16813
val appendName = Metis_Name.fromString "@"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16814
and consName = Metis_Name.fromString "::"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16815
and lengthName = Metis_Name.fromString "length"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16816
and nilName = Metis_Name.fromString "nil"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16817
and nullName = Metis_Name.fromString "null"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16818
and tailName = Metis_Name.fromString "tail";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16819
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16820
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16821
  val baseFix =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16822
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16823
        val fix = unionFixed projectionFixed overflowFixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16824
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16825
        val sucFn = getFunctionFixed fix (sucName,1)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16826
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16827
        fun suc2Fn sz _ x = sucFn sz [x]
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16828
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16829
        insertFunctionFixed fix ((sucName,2), fixed2 suc2Fn)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16830
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16831
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16832
  val fixMap =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16833
      {functionMap = Metis_NameArityMap.fromList
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16834
                       [((appendName,2),addName),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16835
                        ((consName,2),sucName),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16836
                        ((lengthName,1), projectionName 1),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16837
                        ((nilName,0), numeralName 0),
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16838
                        ((tailName,1),preName)],
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16839
       relationMap = Metis_NameArityMap.fromList
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16840
                       [((nullName,1),isZeroName)]};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16841
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16842
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16843
  val listFixed = mapFixed fixMap baseFix;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16844
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16845
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16846
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16847
(* Valuations.                                                               *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16848
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16849
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16850
datatype valuation = Valuation of element Metis_NameMap.map;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16851
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16852
val emptyValuation = Valuation (Metis_NameMap.new ());
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16853
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16854
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
 16855
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16856
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
 16857
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16858
fun constantValuation i =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16859
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16860
      fun add (v,V) = insertValuation V (v,i)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16861
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16862
      Metis_NameSet.foldl add emptyValuation
39351
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
val zeroValuation = constantValuation zeroElement;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16866
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16867
fun getValuation V v =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16868
    case peekValuation V v of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16869
      SOME i => i
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16870
    | 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
 16871
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16872
fun randomValuation {size = N} vs =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16873
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16874
      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
 16875
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16876
      Metis_NameSet.foldl f emptyValuation vs
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16877
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16878
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16879
fun incrementValuation N vars =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16880
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16881
      fun inc vs V =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16882
          case vs of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16883
            [] => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16884
          | v :: vs =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16885
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16886
              val (carry,i) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16887
                  case incrementElement N (getValuation V v) of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16888
                    SOME i => (false,i)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16889
                  | NONE => (true,zeroElement)
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
              val V = insertValuation V (v,i)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16892
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16893
              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
 16894
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16895
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16896
      inc (Metis_NameSet.toList vars)
39351
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
fun foldValuation N vars f =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16900
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16901
      val inc = incrementValuation N vars
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 fold V acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16904
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16905
            val acc = f (V,acc)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16906
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16907
            case inc V of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16908
              NONE => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16909
            | SOME V => fold V acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16910
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16911
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16912
      val zero = zeroValuation vars
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16913
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16914
      fold zero
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16915
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16916
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16917
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16918
(* 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
 16919
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16920
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16921
val UNKNOWN = ~1;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16922
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16923
datatype table =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16924
    ForgetfulTable
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16925
  | ArrayTable of int Array.array;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16926
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16927
fun newTable N arity =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16928
    case elementListSpace {size = N} arity of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16929
      NONE => ForgetfulTable
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16930
    | SOME space => ArrayTable (Array.array (space,UNKNOWN));
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16931
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16932
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16933
  fun randomResult R = Metis_Portable.randomInt R;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16934
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16935
  fun lookupTable N R table elts =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16936
      case table of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16937
        ForgetfulTable => randomResult R
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16938
      | ArrayTable a =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16939
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16940
          val i = elementListIndex {size = N} elts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16941
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16942
          val r = Array.sub (a,i)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16943
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16944
          if r <> UNKNOWN then r
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16945
          else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16946
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16947
              val r = randomResult R
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16948
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16949
              val () = Array.update (a,i,r)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16950
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16951
              r
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16952
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16953
        end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16954
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16955
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16956
fun updateTable N table (elts,r) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16957
    case table of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16958
      ForgetfulTable => ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16959
    | ArrayTable a =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16960
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16961
        val i = elementListIndex {size = N} elts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16962
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16963
        val () = Array.update (a,i,r)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16964
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16965
        ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16966
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16967
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16968
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16969
(* 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
 16970
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16971
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16972
datatype tables =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16973
    Tables of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16974
      {domainSize : int,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16975
       rangeSize : int,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16976
       tableMap : table Metis_NameArityMap.map Unsynchronized.ref};
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16977
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16978
fun newTables N R =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16979
    Tables
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16980
      {domainSize = N,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16981
       rangeSize = R,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16982
       tableMap = Unsynchronized.ref (Metis_NameArityMap.new ())};
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16983
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16984
fun getTables tables n_a =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16985
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16986
      val Tables {domainSize = N, rangeSize = _, tableMap = tm} = tables
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16987
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16988
      val Unsynchronized.ref m = tm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16989
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16990
      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
 16991
        SOME t => t
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16992
      | NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16993
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16994
          val (_,a) = n_a
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16995
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16996
          val t = newTable N a
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 16997
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 16998
          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
 16999
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17000
          val () = tm := m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17001
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17002
          t
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17003
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17004
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17005
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17006
fun lookupTables tables (n,elts) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17007
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17008
      val Tables {domainSize = N, rangeSize = R, ...} = tables
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17009
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17010
      val a = length elts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17011
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17012
      val table = getTables tables (n,a)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17013
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17014
      lookupTable N R table elts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17015
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17016
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17017
fun updateTables tables ((n,elts),r) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17018
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17019
      val Tables {domainSize = N, ...} = tables
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17020
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17021
      val a = length elts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17022
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17023
      val table = getTables tables (n,a)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17024
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17025
      updateTable N table (elts,r)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17026
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17027
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17028
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17029
(* A type of random finite models.                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17030
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17031
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17032
type parameters = {size : int, fixed : fixed};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17033
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17034
datatype model =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17035
    Metis_Model of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17036
      {size : int,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17037
       fixedFunctions : (element list -> element option) Metis_NameArityMap.map,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17038
       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
 17039
       randomFunctions : tables,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17040
       randomRelations : tables};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17041
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17042
fun new {size = N, fixed} =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17043
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17044
      val Fixed {functions = fns, relations = rels} = fixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17045
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17046
      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
 17047
      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
 17048
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17049
      val rndFns = newTables N N
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17050
      and rndRels = newTables N 2
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17051
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17052
      Metis_Model
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17053
        {size = N,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17054
         fixedFunctions = fixFns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17055
         fixedRelations = fixRels,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17056
         randomFunctions = rndFns,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17057
         randomRelations = rndRels}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17058
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17059
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17060
fun size (Metis_Model {size = N, ...}) = N;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17061
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17062
fun peekFixedFunction M (n,elts) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17063
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17064
      val Metis_Model {fixedFunctions = fixFns, ...} = M
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17065
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17066
      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
 17067
        NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17068
      | SOME fixFn => fixFn elts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17069
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17070
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17071
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
 17072
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17073
fun peekFixedRelation M (n,elts) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17074
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17075
      val Metis_Model {fixedRelations = fixRels, ...} = M
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17076
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17077
      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
 17078
        NONE => NONE
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17079
      | SOME fixRel => fixRel elts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17080
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17081
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17082
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
 17083
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17084
(* A default model *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17085
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17086
val defaultSize = 8;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17087
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17088
val defaultFixed =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17089
    unionListFixed
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17090
      [basicFixed,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17091
       projectionFixed,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17092
       modularFixed,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17093
       setFixed,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17094
       listFixed];
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17095
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17096
val default = {size = defaultSize, fixed = defaultFixed};
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17097
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17098
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17099
(* Taking apart terms to interpret them.                                     *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17100
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17101
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17102
fun destTerm tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17103
    case tm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17104
      Metis_Term.Var _ => tm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17105
    | Metis_Term.Fn f_tms =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17106
      case Metis_Term.stripApp tm of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17107
        (_,[]) => tm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17108
      | (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
 17109
      | (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
 17110
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17111
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17112
(* Interpreting terms and formulas in the model.                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17113
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17114
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17115
fun interpretFunction M n_elts =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17116
    case peekFixedFunction M n_elts of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17117
      SOME r => r
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17118
    | NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17119
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17120
        val Metis_Model {randomFunctions = rndFns, ...} = M
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17121
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17122
        lookupTables rndFns n_elts
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17123
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17124
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17125
fun interpretRelation M n_elts =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17126
    case peekFixedRelation M n_elts of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17127
      SOME r => r
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17128
    | NONE =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17129
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17130
        val Metis_Model {randomRelations = rndRels, ...} = M
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17131
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17132
        intToBool (lookupTables rndRels n_elts)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17133
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17134
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17135
fun interpretTerm M V =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17136
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17137
      fun interpret tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17138
          case destTerm tm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17139
            Metis_Term.Var v => getValuation V v
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 17140
          | 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
 17141
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17142
      interpret
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17143
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17144
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17145
fun interpretAtom M V (r,tms) =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 17146
    interpretRelation M (r, List.map (interpretTerm M V) tms);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17147
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17148
fun interpretFormula M =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17149
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17150
      val N = size M
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17151
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17152
      fun interpret V fm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17153
          case fm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17154
            Metis_Formula.True => true
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17155
          | Metis_Formula.False => false
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17156
          | Metis_Formula.Metis_Atom atm => interpretAtom M V atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17157
          | Metis_Formula.Not p => not (interpret V p)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17158
          | 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
 17159
          | 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
 17160
          | 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
 17161
          | 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
 17162
          | Metis_Formula.Forall (v,p) => interpret' V p v N
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17163
          | Metis_Formula.Exists (v,p) =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17164
            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
 17165
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17166
      and interpret' V fm v i =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17167
          i = 0 orelse
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17168
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17169
            val i = i - 1
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17170
            val V' = insertValuation V (v,i)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17171
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17172
            interpret V' fm andalso interpret' V fm v i
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17173
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17174
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17175
      interpret
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17176
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17177
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17178
fun interpretLiteral M V (pol,atm) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17179
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17180
      val b = interpretAtom M V atm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17181
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17182
      if pol then b else not b
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17183
    end;
23442
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
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
 17186
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17187
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17188
(* 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
 17189
(* 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
 17190
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17191
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17192
fun check interpret {maxChecks} M fv x =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17193
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17194
      val N = size M
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17195
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17196
      fun score (V,{T,F}) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17197
          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
 17198
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17199
      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
 17200
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17201
      val maxChecks =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17202
          case maxChecks of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17203
            NONE => maxChecks
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17204
          | SOME m =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17205
            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
 17206
              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
 17207
            | NONE => maxChecks
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17208
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17209
      case maxChecks of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17210
        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
 17211
      | 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
 17212
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17213
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17214
fun checkAtom maxChecks M atm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17215
    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
 17216
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17217
fun checkFormula maxChecks M fm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17218
    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
 17219
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17220
fun checkLiteral maxChecks M lit =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17221
    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
 17222
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17223
fun checkClause maxChecks M cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17224
    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
 17225
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17226
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17227
(* Updating the model.                                                       *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17228
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17229
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17230
fun updateFunction M func_elts_elt =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17231
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17232
      val Metis_Model {randomFunctions = rndFns, ...} = M
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17233
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17234
      val () = updateTables rndFns func_elts_elt
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17235
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17236
      ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17237
    end;
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 updateRelation M (rel_elts,pol) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17240
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17241
      val Metis_Model {randomRelations = rndRels, ...} = M
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17242
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17243
      val () = updateTables rndRels (rel_elts, boolToInt pol)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17244
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17245
      ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17246
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17247
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17248
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17249
(* 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
 17250
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17251
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17252
datatype modelTerm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17253
    ModelVar
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17254
  | 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
 17255
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17256
fun modelTerm M V =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17257
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17258
      fun modelTm tm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17259
          case destTerm tm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17260
            Metis_Term.Var v => (ModelVar, getValuation V v)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17261
          | Metis_Term.Fn (f,tms) =>
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17262
            let
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 17263
              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
 17264
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17265
              (ModelFn (f,tms,xs), interpretFunction M (f,xs))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17266
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17267
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17268
      modelTm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17269
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17270
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17271
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17272
(* Perturbing the model.                                                     *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17273
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17274
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17275
datatype perturbation =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17276
    FunctionPerturbation of (Metis_Term.functionName * element list) * element
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17277
  | 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
 17278
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17279
fun perturb M pert =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17280
    case pert of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17281
      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
 17282
    | 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
 17283
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17284
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17285
  fun pertTerm _ [] _ acc = acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17286
    | pertTerm M target tm acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17287
      case tm of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17288
        ModelVar => acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17289
      | ModelFn (func,tms,xs) =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17290
        let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17291
          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
 17292
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17293
          val func_xs = (func,xs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17294
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17295
          val acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17296
              if isFixedFunction M func_xs then acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17297
              else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17298
                let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17299
                  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
 17300
                in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17301
                  List.foldl add acc target
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17302
                end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17303
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17304
          pertTerms M onTarget tms xs acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17305
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17306
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17307
  and pertTerms M onTarget =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17308
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17309
        val N = size M
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17310
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17311
        fun filterElements pred =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17312
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17313
              fun filt 0 acc = acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17314
                | filt i acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17315
                  let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17316
                    val i = i - 1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17317
                    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
 17318
                  in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17319
                    filt i acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17320
                  end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17321
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17322
              filt N []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17323
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17324
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17325
        fun pert _ [] [] acc = acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17326
          | pert ys (tm :: tms) (x :: xs) acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17327
            let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17328
              fun pred y =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17329
                  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
 17330
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17331
              val target = filterElements pred
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17332
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17333
              val acc = pertTerm M target tm acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17334
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17335
              pert (x :: ys) tms xs acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17336
            end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17337
          | pert _ _ _ _ = raise Bug "Metis_Model.pertTerms.pert"
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17338
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17339
        pert []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17340
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17341
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17342
  fun pertAtom M V target (rel,tms) acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17343
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17344
        fun onTarget ys = interpretRelation M (rel,ys) = target
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17345
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 17346
        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
 17347
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17348
        val rel_xs = (rel,xs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17349
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17350
        val acc =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17351
            if isFixedRelation M rel_xs then acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17352
            else RelationPerturbation (rel_xs,target) :: acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17353
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17354
        pertTerms M onTarget tms xs acc
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17355
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17356
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17357
  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
 17358
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17359
  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
 17360
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17361
  fun pickPerturb M perts =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 17362
      if List.null perts then ()
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17363
      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
 17364
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17365
  fun perturbTerm M V (tm,target) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17366
      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
 17367
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17368
  fun perturbAtom M V (atm,target) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17369
      pickPerturb M (pertAtom M V target atm []);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17370
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17371
  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
 17372
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17373
  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
 17374
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17375
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17376
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17377
(* Pretty printing.                                                          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17378
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17379
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17380
fun pp M =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17381
    Metis_Print.program
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17382
      [Metis_Print.ppString "Metis_Model{",
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17383
       Metis_Print.ppInt (size M),
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17384
       Metis_Print.ppString "}"];
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17385
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17386
end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17387
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17388
(**** Original file: src/Problem.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17389
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17390
(* ========================================================================= *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17391
(* CNF PROBLEMS                                                              *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 17392
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17393
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17394
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17395
signature Metis_Problem =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17396
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17397
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17398
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17399
(* Problems.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17400
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17401
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17402
type problem =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17403
     {axioms : Metis_Thm.clause list,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17404
      conjecture : Metis_Thm.clause list}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17405
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17406
val size : problem -> {clauses : int,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17407
                       literals : int,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17408
                       symbols : int,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17409
                       typedSymbols : int}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17410
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17411
val freeVars : problem -> Metis_NameSet.set
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17412
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17413
val toClauses : problem -> Metis_Thm.clause list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17414
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17415
val toFormula : problem -> Metis_Formula.formula
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17416
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17417
val toGoal : problem -> Metis_Formula.formula
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17418
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17419
val toString : problem -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17420
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17421
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17422
(* Categorizing problems.                                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17423
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17424
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17425
datatype propositional =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17426
    Propositional
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17427
  | EffectivelyPropositional
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17428
  | NonPropositional
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17429
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17430
datatype equality =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17431
    NonEquality
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17432
  | Equality
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17433
  | PureEquality
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17434
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17435
datatype horn =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17436
    Trivial
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17437
  | Unit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17438
  | DoubleHorn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17439
  | Horn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17440
  | NegativeHorn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17441
  | NonHorn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17443
type category =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17444
     {propositional : propositional,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17445
      equality : equality,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17446
      horn : horn}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17447
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17448
val categorize : problem -> category
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17449
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17450
val categoryToString : category -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17451
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17452
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17453
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17454
(**** Original file: src/Problem.sml ****)
23442
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
(* ========================================================================= *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17457
(* CNF PROBLEMS                                                              *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 17458
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17459
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17460
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17461
structure Metis_Problem :> Metis_Problem =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17462
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17463
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17464
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17465
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17466
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17467
(* Problems.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17468
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17469
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17470
type problem =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17471
     {axioms : Metis_Thm.clause list,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17472
      conjecture : Metis_Thm.clause list};
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17473
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17474
fun toClauses {axioms,conjecture} = axioms @ conjecture;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17475
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17476
fun size prob =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17477
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17478
      fun lits (cl,n) = n + Metis_LiteralSet.size cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17479
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17480
      fun syms (cl,n) = n + Metis_LiteralSet.symbols cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17481
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17482
      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
 17483
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17484
      val cls = toClauses prob
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17485
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17486
      {clauses = length cls,
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17487
       literals = List.foldl lits 0 cls,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17488
       symbols = List.foldl syms 0 cls,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17489
       typedSymbols = List.foldl typedSyms 0 cls}
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17490
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17491
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17492
fun freeVars {axioms,conjecture} =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17493
    Metis_NameSet.union
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17494
      (Metis_LiteralSet.freeVarsList axioms)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17495
      (Metis_LiteralSet.freeVarsList conjecture);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17496
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17497
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17498
  fun clauseToFormula cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17499
      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
 17500
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17501
  fun toFormula prob =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 17502
      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
 17503
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17504
  fun toGoal {axioms,conjecture} =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17505
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17506
        val clToFm = Metis_Formula.generalize o clauseToFormula
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 17507
        val clsToFm = Metis_Formula.listMkConj o List.map clToFm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17508
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17509
        val fm = Metis_Formula.False
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17510
        val fm =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 17511
            if List.null conjecture then fm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17512
            else Metis_Formula.Imp (clsToFm conjecture, fm)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17513
        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
 17514
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17515
        fm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17516
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17517
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17518
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17519
fun toString prob = Metis_Formula.toString (toFormula prob);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17520
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17521
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17522
(* Categorizing problems.                                                    *)
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
datatype propositional =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17526
    Propositional
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17527
  | EffectivelyPropositional
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17528
  | NonPropositional;
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
datatype equality =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17531
    NonEquality
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17532
  | Equality
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17533
  | PureEquality;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17534
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17535
datatype horn =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17536
    Trivial
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17537
  | Unit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17538
  | DoubleHorn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17539
  | Horn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17540
  | NegativeHorn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17541
  | NonHorn;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17542
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17543
type category =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17544
     {propositional : propositional,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17545
      equality : equality,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17546
      horn : horn};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17547
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17548
fun categorize prob =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17549
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17550
      val cls = toClauses prob
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17551
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17552
      val rels =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17553
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17554
            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
 17555
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17556
            List.foldl f Metis_NameAritySet.empty cls
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17557
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17558
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17559
      val funs =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17560
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17561
            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
 17562
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17563
            List.foldl f Metis_NameAritySet.empty cls
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
      val propositional =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17567
          if Metis_NameAritySet.allNullary rels then Propositional
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17568
          else if Metis_NameAritySet.allNullary funs then EffectivelyPropositional
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17569
          else NonPropositional
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17570
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17571
      val equality =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17572
          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
 17573
          else if Metis_NameAritySet.size rels = 1 then PureEquality
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17574
          else Equality
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17575
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17576
      val horn =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17577
          if List.exists Metis_LiteralSet.null cls then Trivial
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17578
          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
 17579
          else
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17580
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17581
              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
 17582
              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
 17583
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17584
              case (List.all pos cls, List.all neg cls) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17585
                (true,true) => DoubleHorn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17586
              | (true,false) => Horn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17587
              | (false,true) => NegativeHorn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17588
              | (false,false) => NonHorn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17589
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17590
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17591
      {propositional = propositional,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17592
       equality = equality,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17593
       horn = horn}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17594
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17595
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17596
fun categoryToString {propositional,equality,horn} =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17597
    (case propositional of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17598
       Propositional => "propositional"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17599
     | EffectivelyPropositional => "effectively propositional"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17600
     | NonPropositional => "non-propositional") ^
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17601
    ", " ^
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17602
    (case equality of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17603
       NonEquality => "non-equality"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17604
     | Equality => "equality"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17605
     | PureEquality => "pure equality") ^
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17606
    ", " ^
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17607
    (case horn of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17608
       Trivial => "trivial"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17609
     | Unit => "unit"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17610
     | DoubleHorn => "horn (and negative horn)"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17611
     | Horn => "horn"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17612
     | NegativeHorn => "negative horn"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17613
     | NonHorn => "non-horn");
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17614
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17615
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17616
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17617
(**** Original file: src/TermNet.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17618
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17619
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17620
(* MATCHING AND UNIFICATION FOR SETS OF FIRST ORDER LOGIC TERMS              *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 17621
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17622
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17623
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17624
signature Metis_TermNet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17625
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17626
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17627
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17628
(* 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
 17629
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17630
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17631
type parameters = {fifo : bool}
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
type 'a termNet
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
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17637
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17638
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17639
val new : parameters -> 'a termNet
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17640
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17641
val null : 'a termNet -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17642
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17643
val size : 'a termNet -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17644
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17645
val insert : 'a termNet -> Metis_Term.term * 'a -> 'a termNet
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17646
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17647
val fromList : parameters -> (Metis_Term.term * 'a) list -> 'a termNet
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17648
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17649
val filter : ('a -> bool) -> 'a termNet -> 'a termNet
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17650
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17651
val toString : 'a termNet -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17652
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17653
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
 17654
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17655
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17656
(* Matching and unification queries.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17657
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17658
(* These function return OVER-APPROXIMATIONS!                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17659
(* Filter afterwards to get the precise set of satisfying values.            *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17662
val match : 'a termNet -> Metis_Term.term -> 'a list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17663
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17664
val matched : 'a termNet -> Metis_Term.term -> 'a list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17665
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17666
val unify : 'a termNet -> Metis_Term.term -> 'a list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17667
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17668
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17669
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17670
(**** Original file: src/TermNet.sml ****)
23442
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
(* MATCHING AND UNIFICATION FOR SETS OF FIRST ORDER LOGIC TERMS              *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 17674
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17675
(* ========================================================================= *)
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
structure Metis_TermNet :> Metis_TermNet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17678
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17679
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17680
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17681
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17682
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17683
(* Anonymous variables.                                                      *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17684
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17685
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17686
val anonymousName = Metis_Name.fromString "_";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17687
val anonymousVar = Metis_Term.Var anonymousName;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17688
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17689
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17690
(* Quotient terms.                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17691
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17692
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17693
datatype qterm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17694
    Var
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17695
  | Fn of Metis_NameArity.nameArity * qterm list;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17696
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17697
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17698
  fun cmp [] = EQUAL
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17699
    | cmp (q1_q2 :: qs) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17700
      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
 17701
      else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17702
        case q1_q2 of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17703
          (Var,Var) => EQUAL
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17704
        | (Var, Fn _) => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17705
        | (Fn _, Var) => GREATER
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17706
        | (Fn f1, Fn f2) => fnCmp f1 f2 qs
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17707
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17708
  and fnCmp (n1,q1) (n2,q2) qs =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17709
    case Metis_NameArity.compare (n1,n2) of
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17710
      LESS => LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17711
    | EQUAL => cmp (zip q1 q2 @ qs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17712
    | GREATER => GREATER;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17713
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17714
  fun compareQterm q1_q2 = cmp [q1_q2];
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17715
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17716
  fun compareFnQterm (f1,f2) = fnCmp f1 f2 [];
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17717
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17718
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17719
fun equalQterm q1 q2 = compareQterm (q1,q2) = EQUAL;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17720
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17721
fun equalFnQterm f1 f2 = compareFnQterm (f1,f2) = EQUAL;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17722
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17723
fun termToQterm (Metis_Term.Var _) = Var
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 17724
  | 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
 17725
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17726
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17727
  fun qm [] = true
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17728
    | qm ((Var,_) :: rest) = qm rest
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17729
    | qm ((Fn _, Var) :: _) = false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17730
    | qm ((Fn (f,a), Fn (g,b)) :: rest) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17731
      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
 17732
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17733
  fun matchQtermQterm qtm qtm' = qm [(qtm,qtm')];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17734
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17735
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17736
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17737
  fun qm [] = true
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17738
    | qm ((Var,_) :: rest) = qm rest
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17739
    | qm ((Fn _, Metis_Term.Var _) :: _) = false
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17740
    | 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
 17741
      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
 17742
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17743
  fun matchQtermTerm qtm tm = qm [(qtm,tm)];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17744
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17745
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17746
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17747
  fun qn qsub [] = SOME qsub
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17748
    | qn qsub ((Metis_Term.Var v, qtm) :: rest) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17749
      (case Metis_NameMap.peek qsub v of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17750
         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
 17751
       | 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
 17752
    | qn _ ((Metis_Term.Fn _, Var) :: _) = NONE
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17753
    | 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
 17754
      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
 17755
      else NONE;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17756
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17757
  fun matchTermQterm qsub tm qtm = qn qsub [(tm,qtm)];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17758
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17759
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17760
local
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17761
  fun qv Var x = x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17762
    | qv x Var = x
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17763
    | qv (Fn (f,a)) (Fn (g,b)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17764
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17765
        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
 17766
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17767
        Fn (f, zipWith qv a b)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17768
      end;
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
  fun qu qsub [] = qsub
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17771
    | qu qsub ((Var, _) :: rest) = qu qsub rest
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17772
    | qu qsub ((qtm, Metis_Term.Var v) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17773
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17774
        val qtm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17775
            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
 17776
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17777
        qu (Metis_NameMap.insert qsub (v,qtm)) rest
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17778
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17779
    | 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
 17780
      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
 17781
      else raise Error "Metis_TermNet.qu";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17782
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17783
  fun unifyQtermQterm qtm qtm' = total (qv qtm) qtm';
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
  fun unifyQtermTerm qsub qtm tm = total (qu qsub) [(qtm,tm)];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17786
end;
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
local
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17789
  fun qtermToTerm Var = anonymousVar
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 17790
    | 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
 17791
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17792
  val ppQterm = Metis_Print.ppMap qtermToTerm Metis_Term.pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17793
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17794
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
(* 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
 17797
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17798
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17799
type parameters = {fifo : bool};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17800
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17801
datatype 'a net =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17802
    Result of 'a list
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17803
  | Single of qterm * 'a net
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17804
  | 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
 17805
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17806
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
 17807
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17808
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17809
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17810
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17811
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17812
fun new parm = Net (parm,0,NONE);
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17813
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17814
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17815
  fun computeSize (Result l) = length l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17816
    | computeSize (Single (_,n)) = computeSize n
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17817
    | computeSize (Multiple (vs,fs)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17818
      Metis_NameArityMap.foldl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17819
        (fn (_,n,acc) => acc + computeSize n)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17820
        (case vs of SOME n => computeSize n | NONE => 0)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17821
        fs;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17822
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17823
  fun netSize NONE = NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17824
    | netSize (SOME n) = SOME (computeSize n, n);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17825
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17826
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17827
fun size (Net (_,_,NONE)) = 0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17828
  | size (Net (_, _, SOME (i,_))) = i;
23442
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
fun null net = size net = 0;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17831
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17832
fun singles qtms a = List.foldr Single a qtms;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17833
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17834
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17835
  fun pre NONE = (0,NONE)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17836
    | pre (SOME (i,n)) = (i, SOME n);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17837
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17838
  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
 17839
    | 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
 17840
      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
 17841
      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
 17842
    | add a (Var :: qtms) (Multiple (vs,fs)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17843
      Multiple (SOME (oadd a qtms vs), fs)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17844
    | add a (Fn (f,l) :: qtms) (Multiple (vs,fs)) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17845
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17846
        val n = Metis_NameArityMap.peek fs f
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17847
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17848
        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
 17849
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17850
    | add _ _ _ = raise Bug "Metis_TermNet.insert: Match"
23442
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
  and oadd a qtms NONE = singles qtms a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17853
    | oadd a qtms (SOME n) = add a qtms n;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17854
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17855
  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
 17856
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17857
  fun insert (Net (p,k,n)) (tm,a) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17858
      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
 17859
      handle Error _ => raise Bug "Metis_TermNet.insert: should never fail";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17860
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17861
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 17862
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
 17863
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17864
fun filter pred =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17865
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17866
      fun filt (Result l) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17867
          (case List.filter (fn (_,a) => pred a) l of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17868
             [] => NONE
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17869
           | l => SOME (Result l))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17870
        | filt (Single (qtm,n)) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17871
          (case filt n of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17872
             NONE => NONE
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17873
           | SOME n => SOME (Single (qtm,n)))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17874
        | filt (Multiple (vs,fs)) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17875
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17876
            val vs = Option.mapPartial filt vs
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17877
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17878
            val fs = Metis_NameArityMap.mapPartial (fn (_,n) => filt n) fs
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17879
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17880
            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
 17881
            else SOME (Multiple (vs,fs))
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17882
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17883
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17884
      fn net as Net (_,_,NONE) => net
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17885
       | 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
 17886
    end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17887
    handle Error _ => raise Bug "Metis_TermNet.filter: should never fail";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17888
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17889
fun toString net = "Metis_TermNet[" ^ Int.toString (size net) ^ "]";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17890
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17891
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17892
(* Specialized fold operations to support matching and unification.          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17893
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17894
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17895
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17896
  fun norm (0 :: ks, (f as (_,n)) :: fs, qtms) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17897
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17898
        val (a,qtms) = revDivide qtms n
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17899
      in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17900
        addQterm (Fn (f,a)) (ks,fs,qtms)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17901
      end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17902
    | norm stack = stack
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
  and addQterm qtm (ks,fs,qtms) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17905
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17906
        val ks = case ks of [] => [] | k :: ks => (k - 1) :: ks
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17907
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17908
        norm (ks, fs, qtm :: qtms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17909
      end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17910
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17911
  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
 17912
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17913
  val stackEmpty = ([],[],[]);
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17914
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17915
  val stackAddQterm = addQterm;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17916
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17917
  val stackAddFn = addFn;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17918
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17919
  fun stackValue ([],[],[qtm]) = qtm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17920
    | stackValue _ = raise Bug "Metis_TermNet.stackValue";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17921
end;
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
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17924
  fun fold _ acc [] = acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17925
    | fold inc acc ((0,stack,net) :: rest) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17926
      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
 17927
    | fold inc acc ((n, stack, Single (qtm,net)) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17928
      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
 17929
    | fold inc acc ((n, stack, Multiple (v,fns)) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17930
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17931
        val n = n - 1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17932
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17933
        val rest =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17934
            case v of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17935
              NONE => rest
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17936
            | SOME net => (n, stackAddQterm Var stack, net) :: rest
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
        fun getFns (f as (_,k), net, x) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17939
            (k + n, stackAddFn f stack, net) :: x
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17940
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17941
        fold inc acc (Metis_NameArityMap.foldr getFns rest fns)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17942
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17943
    | fold _ _ _ = raise Bug "Metis_TermNet.foldTerms.fold";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17944
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17945
  fun foldTerms inc acc net = fold inc acc [(1,stackEmpty,net)];
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17948
fun foldEqualTerms pat inc acc =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17949
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17950
      fun fold ([],net) = inc (pat,net,acc)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17951
        | fold (pat :: pats, Single (qtm,net)) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17952
          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
 17953
        | fold (Var :: pats, Multiple (v,_)) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17954
          (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
 17955
        | fold (Fn (f,a) :: pats, Multiple (_,fns)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17956
          (case Metis_NameArityMap.peek fns f of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17957
             NONE => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17958
           | SOME net => fold (a @ pats, net))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17959
        | fold _ = raise Bug "Metis_TermNet.foldEqualTerms.fold";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17960
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17961
      fn net => fold ([pat],net)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17962
    end;
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
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17965
  fun fold _ acc [] = acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17966
    | fold inc acc (([],stack,net) :: rest) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17967
      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
 17968
    | fold inc acc ((Var :: pats, stack, net) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17969
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17970
        fun harvest (qtm,n,l) = (pats, stackAddQterm qtm stack, n) :: l
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17971
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17972
        fold inc acc (foldTerms harvest rest net)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17973
      end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17974
    | fold inc acc ((pat :: pats, stack, Single (qtm,net)) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17975
      (case unifyQtermQterm pat qtm of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17976
         NONE => fold inc acc rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17977
       | SOME qtm =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17978
         fold inc acc ((pats, stackAddQterm qtm stack, net) :: rest))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17979
    | fold
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17980
        inc acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 17981
        (((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
 17982
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17983
        val rest =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17984
            case v of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17985
              NONE => rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17986
            | SOME net => (pats, stackAddQterm pat stack, net) :: rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17987
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17988
        val rest =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17989
            case Metis_NameArityMap.peek fns f of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17990
              NONE => rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17991
            | SOME net => (a @ pats, stackAddFn f stack, net) :: rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17992
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17993
        fold inc acc rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17994
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 17995
    | fold _ _ _ = raise Bug "Metis_TermNet.foldUnifiableTerms.fold";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17996
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17997
  fun foldUnifiableTerms pat inc acc net =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17998
      fold inc acc [([pat],stackEmpty,net)];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 17999
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18000
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
(* Matching and unification queries.                                         *)
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
(* These function return OVER-APPROXIMATIONS!                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18005
(* Filter afterwards to get the precise set of satisfying values.            *)
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18008
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18009
  fun idwise ((m,_),(n,_)) = Int.compare (m,n);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18010
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18011
  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
 18012
in
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18013
  fun finally parm l = List.map snd (fifoize parm l);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18014
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18015
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18016
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18017
  fun mat acc [] = acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18018
    | 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
 18019
    | mat acc ((Single (qtm,n), tm :: tms) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18020
      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
 18021
    | mat acc ((Multiple (vs,fs), tm :: tms) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18022
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18023
        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
 18024
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18025
        val rest =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18026
            case tm of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18027
              Metis_Term.Var _ => rest
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18028
            | Metis_Term.Fn (f,l) =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18029
              case Metis_NameArityMap.peek fs (f, length l) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18030
                NONE => rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18031
              | SOME n => (n, l @ tms) :: rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18032
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18033
        mat acc rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18034
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18035
    | mat _ _ = raise Bug "Metis_TermNet.match: Match";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18036
in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18037
  fun match (Net (_,_,NONE)) _ = []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18038
    | match (Net (p, _, SOME (_,n))) tm =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18039
      finally p (mat [] [(n,[tm])])
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18040
      handle Error _ => raise Bug "Metis_TermNet.match: should never fail";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18041
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18042
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18043
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18044
  fun unseenInc qsub v tms (qtm,net,rest) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18045
      (Metis_NameMap.insert qsub (v,qtm), net, tms) :: rest;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18046
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18047
  fun seenInc qsub tms (_,net,rest) = (qsub,net,tms) :: rest;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18048
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18049
  fun mat acc [] = acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18050
    | 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
 18051
    | mat acc ((qsub, Single (qtm,net), tm :: tms) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18052
      (case matchTermQterm qsub tm qtm of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18053
         NONE => mat acc rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18054
       | SOME qsub => mat acc ((qsub,net,tms) :: rest))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18055
    | 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
 18056
      (case Metis_NameMap.peek qsub v of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18057
         NONE => mat acc (foldTerms (unseenInc qsub v tms) rest net)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18058
       | 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
 18059
    | 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
 18060
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18061
        val rest =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18062
            case Metis_NameArityMap.peek fns (f, length a) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18063
              NONE => rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18064
            | SOME net => (qsub, net, a @ tms) :: rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18065
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18066
        mat acc rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18067
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18068
    | mat _ _ = raise Bug "Metis_TermNet.matched.mat";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18069
in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18070
  fun matched (Net (_,_,NONE)) _ = []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18071
    | matched (Net (parm, _, SOME (_,net))) tm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18072
      finally parm (mat [] [(Metis_NameMap.new (), net, [tm])])
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18073
      handle Error _ => raise Bug "Metis_TermNet.matched: should never fail";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18074
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18075
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18076
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18077
  fun inc qsub v tms (qtm,net,rest) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18078
      (Metis_NameMap.insert qsub (v,qtm), net, tms) :: rest;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18079
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18080
  fun mat acc [] = acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18081
    | 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
 18082
    | mat acc ((qsub, Single (qtm,net), tm :: tms) :: rest) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18083
      (case unifyQtermTerm qsub qtm tm of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18084
         NONE => mat acc rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18085
       | SOME qsub => mat acc ((qsub,net,tms) :: rest))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18086
    | 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
 18087
      (case Metis_NameMap.peek qsub v of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18088
         NONE => mat acc (foldTerms (inc qsub v tms) rest net)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18089
       | 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
 18090
    | 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
 18091
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18092
        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
 18093
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18094
        val rest =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18095
            case Metis_NameArityMap.peek fns (f, length a) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18096
              NONE => rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18097
            | SOME net => (qsub, net, a @ tms) :: rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18098
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18099
        mat acc rest
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18100
      end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18101
    | mat _ _ = raise Bug "Metis_TermNet.unify.mat";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18102
in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18103
  fun unify (Net (_,_,NONE)) _ = []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18104
    | unify (Net (parm, _, SOME (_,net))) tm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18105
      finally parm (mat [] [(Metis_NameMap.new (), net, [tm])])
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18106
      handle Error _ => raise Bug "Metis_TermNet.unify: should never fail";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18107
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18108
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18109
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18110
(* Pretty printing.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18111
(* ------------------------------------------------------------------------- *)
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
local
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18114
  fun inc (qtm, Result l, acc) =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18115
      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
 18116
    | inc _ = raise Bug "Metis_TermNet.pp.inc";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18117
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18118
  fun toList (Net (_,_,NONE)) = []
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18119
    | toList (Net (parm, _, SOME (_,net))) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18120
      finally parm (foldTerms inc [] net);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18121
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18122
  fun pp ppA =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18123
      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
 18124
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18125
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18126
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18127
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18128
(**** Original file: src/AtomNet.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18129
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18130
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18131
(* MATCHING AND UNIFICATION FOR SETS OF FIRST ORDER LOGIC ATOMS              *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 18132
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18133
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18134
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18135
signature Metis_AtomNet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18136
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18137
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18138
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18139
(* 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
 18140
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18141
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18142
type parameters = {fifo : bool}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18143
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18144
type 'a atomNet
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18145
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18146
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18147
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18148
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18149
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18150
val new : parameters -> 'a atomNet
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18151
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18152
val size : 'a atomNet -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18153
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18154
val insert : 'a atomNet -> Metis_Atom.atom * 'a -> 'a atomNet
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18155
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18156
val fromList : parameters -> (Metis_Atom.atom * 'a) list -> 'a atomNet
23442
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
val filter : ('a -> bool) -> 'a atomNet -> 'a atomNet
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18159
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18160
val toString : 'a atomNet -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18161
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18162
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
 18163
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18164
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18165
(* Matching and unification queries.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18166
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18167
(* These function return OVER-APPROXIMATIONS!                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18168
(* Filter afterwards to get the precise set of satisfying values.            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18169
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18170
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18171
val match : 'a atomNet -> Metis_Atom.atom -> 'a list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18172
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18173
val matched : 'a atomNet -> Metis_Atom.atom -> 'a list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18174
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18175
val unify : 'a atomNet -> Metis_Atom.atom -> 'a list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18176
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18177
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18178
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18179
(**** Original file: src/AtomNet.sml ****)
23442
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
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18182
(* MATCHING AND UNIFICATION FOR SETS OF FIRST ORDER LOGIC ATOMS              *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 18183
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18186
structure Metis_AtomNet :> Metis_AtomNet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18187
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18188
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18189
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18190
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18191
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18192
(* Helper functions.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18193
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18194
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18195
fun atomToTerm atom = Metis_Term.Fn atom;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18196
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18197
fun termToAtom (Metis_Term.Var _) = raise Bug "Metis_AtomNet.termToAtom"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18198
  | termToAtom (Metis_Term.Fn atom) = atom;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18199
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18200
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18201
(* 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
 18202
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18203
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18204
type parameters = Metis_TermNet.parameters;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18205
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18206
type 'a atomNet = 'a Metis_TermNet.termNet;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18207
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18208
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18209
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18210
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18211
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18212
val new = Metis_TermNet.new;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18213
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18214
val size = Metis_TermNet.size;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18215
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18216
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
 18217
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18218
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
 18219
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18220
val filter = Metis_TermNet.filter;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18221
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18222
fun toString net = "Metis_AtomNet[" ^ Int.toString (size net) ^ "]";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18223
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18224
val pp = Metis_TermNet.pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18225
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18226
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18227
(* Matching and unification queries.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18228
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18229
(* These function return OVER-APPROXIMATIONS!                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18230
(* Filter afterwards to get the precise set of satisfying values.            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18231
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18232
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18233
fun match net atm = Metis_TermNet.match net (atomToTerm atm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18234
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18235
fun matched net atm = Metis_TermNet.matched net (atomToTerm atm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18236
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18237
fun unify net atm = Metis_TermNet.unify net (atomToTerm atm);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18238
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18239
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18240
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18241
(**** Original file: src/LiteralNet.sig ****)
23442
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
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18244
(* MATCHING AND UNIFICATION FOR SETS OF FIRST ORDER LOGIC LITERALS           *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 18245
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18246
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18247
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18248
signature Metis_LiteralNet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18249
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18250
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18251
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18252
(* 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
 18253
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18254
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18255
type parameters = {fifo : bool}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18256
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18257
type 'a literalNet
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
(* Basic operations.                                                         *)
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18263
val new : parameters -> 'a literalNet
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
val size : 'a literalNet -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18266
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18267
val profile : 'a literalNet -> {positive : int, negative : int}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18268
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18269
val insert : 'a literalNet -> Metis_Literal.literal * 'a -> 'a literalNet
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18270
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18271
val fromList : parameters -> (Metis_Literal.literal * 'a) list -> 'a literalNet
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18272
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18273
val filter : ('a -> bool) -> 'a literalNet -> 'a literalNet
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18274
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18275
val toString : 'a literalNet -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18276
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18277
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
 18278
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18279
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18280
(* Matching and unification queries.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18281
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18282
(* These function return OVER-APPROXIMATIONS!                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18283
(* Filter afterwards to get the precise set of satisfying values.            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18284
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18285
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18286
val match : 'a literalNet -> Metis_Literal.literal -> 'a list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18287
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18288
val matched : 'a literalNet -> Metis_Literal.literal -> 'a list
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18289
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18290
val unify : 'a literalNet -> Metis_Literal.literal -> 'a list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18291
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18292
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18293
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18294
(**** Original file: src/LiteralNet.sml ****)
23442
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
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18297
(* MATCHING AND UNIFICATION FOR SETS OF FIRST ORDER LOGIC LITERALS           *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 18298
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18301
structure Metis_LiteralNet :> Metis_LiteralNet =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18302
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18303
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18304
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18305
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18306
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18307
(* 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
 18308
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18309
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18310
type parameters = Metis_AtomNet.parameters;
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
type 'a literalNet =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18313
    {positive : 'a Metis_AtomNet.atomNet,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18314
     negative : 'a Metis_AtomNet.atomNet};
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18317
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18318
(* ------------------------------------------------------------------------- *)
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
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
 18321
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18322
local
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18323
  fun pos ({positive,...} : 'a literalNet) = Metis_AtomNet.size positive;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18324
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18325
  fun neg ({negative,...} : 'a literalNet) = Metis_AtomNet.size negative;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18326
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18327
  fun size net = pos net + neg net;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18328
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18329
  fun profile net = {positive = pos net, negative = neg net};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18330
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18331
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18332
fun insert {positive,negative} ((true,atm),a) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18333
    {positive = Metis_AtomNet.insert positive (atm,a), negative = negative}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18334
  | insert {positive,negative} ((false,atm),a) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18335
    {positive = positive, negative = Metis_AtomNet.insert negative (atm,a)};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18336
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18337
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
 18338
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18339
fun filter pred {positive,negative} =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18340
    {positive = Metis_AtomNet.filter pred positive,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18341
     negative = Metis_AtomNet.filter pred negative};
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18342
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18343
fun toString net = "Metis_LiteralNet[" ^ Int.toString (size net) ^ "]";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18344
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18345
fun pp ppA =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18346
    Metis_Print.ppMap
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18347
      (fn {positive,negative} => (positive,negative))
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18348
      (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
 18349
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18350
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18351
(* Matching and unification queries.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18352
(*                                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18353
(* These function return OVER-APPROXIMATIONS!                                *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18354
(* Filter afterwards to get the precise set of satisfying values.            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18355
(* ------------------------------------------------------------------------- *)
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
fun match ({positive,...} : 'a literalNet) (true,atm) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18358
    Metis_AtomNet.match positive atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18359
  | match {negative,...} (false,atm) = Metis_AtomNet.match negative atm;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18360
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18361
fun matched ({positive,...} : 'a literalNet) (true,atm) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18362
    Metis_AtomNet.matched positive atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18363
  | matched {negative,...} (false,atm) = Metis_AtomNet.matched negative atm;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18364
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18365
fun unify ({positive,...} : 'a literalNet) (true,atm) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18366
    Metis_AtomNet.unify positive atm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18367
  | unify {negative,...} (false,atm) = Metis_AtomNet.unify negative atm;
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
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18370
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18371
(**** Original file: src/Subsume.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18372
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18373
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18374
(* SUBSUMPTION CHECKING FOR FIRST ORDER LOGIC CLAUSES                        *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 18375
(* Copyright (c) 2002 Joe Leslie-Hurd, distributed under the BSD License     *)
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
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18378
signature Metis_Subsume =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18379
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18380
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18381
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18382
(* A type of clause sets that supports efficient subsumption checking.       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18383
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18384
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18385
type 'a subsume
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18386
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18387
val new : unit -> 'a subsume
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
val size : 'a subsume -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18390
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18391
val insert : 'a subsume -> Metis_Thm.clause * 'a -> 'a subsume
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18392
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18393
val filter : ('a -> bool) -> 'a subsume -> 'a subsume
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18394
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18395
val pp : 'a subsume Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18396
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18397
val toString : 'a subsume -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18398
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18399
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18400
(* Subsumption checking.                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18401
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18402
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18403
val subsumes :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18404
    (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
 18405
    (Metis_Thm.clause * Metis_Subst.subst * 'a) option
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18406
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18407
val isSubsumed : 'a subsume -> Metis_Thm.clause -> bool
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18408
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18409
val strictlySubsumes :  (* exclude subsuming clauses with more literals *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18410
    (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
 18411
    (Metis_Thm.clause * Metis_Subst.subst * 'a) option
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18412
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18413
val isStrictlySubsumed : 'a subsume -> Metis_Thm.clause -> bool
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18414
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18415
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18416
(* Single clause versions.                                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18417
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18418
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18419
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
 18420
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18421
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
 18422
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18423
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18424
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18425
(**** Original file: src/Subsume.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18426
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18427
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18428
(* SUBSUMPTION CHECKING FOR FIRST ORDER LOGIC CLAUSES                        *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 18429
(* Copyright (c) 2002 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18430
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18431
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18432
structure Metis_Subsume :> Metis_Subsume =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18433
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18434
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18435
open Metis_Useful;
23442
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18438
(* Helper functions.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18439
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18440
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18441
fun findRest pred =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18442
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18443
      fun f _ [] = NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18444
        | f ys (x :: xs) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18445
          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
 18446
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18447
      f []
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
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18451
  fun addSym (lit,acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18452
      case total Metis_Literal.sym lit of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18453
        NONE => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18454
      | SOME lit => lit :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18455
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18456
  fun clauseSym lits = List.foldl addSym lits lits;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18457
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18458
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18459
fun sortClause cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18460
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18461
      val lits = Metis_LiteralSet.toList cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18462
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18463
      sortMap Metis_Literal.typedSymbols (revCompare Int.compare) lits
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18464
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18465
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18466
fun incompatible lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18467
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18468
      val lits = clauseSym [lit]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18469
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18470
      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
 18471
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18472
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18473
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18474
(* Metis_Clause ids and lengths.                                                   *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18475
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18476
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18477
type clauseId = int;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18478
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18479
type clauseLength = int;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18480
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18481
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18482
  type idSet = (clauseId * clauseLength) Metis_Set.set;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18483
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18484
  fun idCompare ((id1,len1),(id2,len2)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18485
      case Int.compare (len1,len2) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18486
        LESS => LESS
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18487
      | EQUAL => Int.compare (id1,id2)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18488
      | GREATER => GREATER;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18489
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18490
  val idSetEmpty : idSet = Metis_Set.empty idCompare;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18491
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18492
  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
 18493
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18494
  fun idSetAddMax max (id_len as (_,len), set) : idSet =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18495
      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
 18496
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18497
  fun idSetIntersect set1 set2 : idSet = Metis_Set.intersect set1 set2;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18498
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18499
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18500
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18501
(* A type of clause sets that supports efficient subsumption checking.       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18502
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18503
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18504
datatype 'a subsume =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18505
    Metis_Subsume of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18506
      {empty : (Metis_Thm.clause * Metis_Subst.subst * 'a) list,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18507
       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
 18508
       nonunit :
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18509
         {nextId : clauseId,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18510
          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
 18511
          fstLits : (clauseId * clauseLength) Metis_LiteralNet.literalNet,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18512
          sndLits : (clauseId * clauseLength) Metis_LiteralNet.literalNet}};
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
fun new () =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18515
    Metis_Subsume
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18516
      {empty = [],
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18517
       unit = Metis_LiteralNet.new {fifo = false},
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18518
       nonunit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18519
         {nextId = 0,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18520
          clauses = Metis_IntMap.new (),
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18521
          fstLits = Metis_LiteralNet.new {fifo = false},
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18522
          sndLits = Metis_LiteralNet.new {fifo = false}}};
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18523
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18524
fun size (Metis_Subsume {empty, unit, nonunit = {clauses,...}}) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18525
    length empty + Metis_LiteralNet.size unit + Metis_IntMap.size clauses;
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 18526
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18527
fun insert (Metis_Subsume {empty,unit,nonunit}) (cl',a) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18528
    case sortClause cl' of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18529
      [] =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18530
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18531
        val empty = (cl',Metis_Subst.empty,a) :: empty
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18532
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18533
        Metis_Subsume {empty = empty, unit = unit, nonunit = nonunit}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18534
      end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18535
    | [lit] =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18536
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18537
        val unit = Metis_LiteralNet.insert unit (lit,(lit,cl',a))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18538
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18539
        Metis_Subsume {empty = empty, unit = unit, nonunit = nonunit}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18540
      end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18541
    | fstLit :: (nonFstLits as sndLit :: otherLits) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18542
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18543
        val {nextId,clauses,fstLits,sndLits} = nonunit
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18544
        val id_length = (nextId, Metis_LiteralSet.size cl')
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18545
        val fstLits = Metis_LiteralNet.insert fstLits (fstLit,id_length)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18546
        val (sndLit,otherLits) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18547
            case findRest (incompatible fstLit) nonFstLits of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18548
              SOME sndLit_otherLits => sndLit_otherLits
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18549
            | NONE => (sndLit,otherLits)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18550
        val sndLits = Metis_LiteralNet.insert sndLits (sndLit,id_length)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18551
        val lits' = otherLits @ [fstLit,sndLit]
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18552
        val clauses = Metis_IntMap.insert clauses (nextId,(lits',cl',a))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18553
        val nextId = nextId + 1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18554
        val nonunit = {nextId = nextId, clauses = clauses,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18555
                       fstLits = fstLits, sndLits = sndLits}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18556
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18557
        Metis_Subsume {empty = empty, unit = unit, nonunit = nonunit}
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18558
      end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18559
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18560
fun filter pred (Metis_Subsume {empty,unit,nonunit}) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18561
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18562
      val empty = List.filter (pred o #3) empty
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18563
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18564
      val unit = Metis_LiteralNet.filter (pred o #3) unit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18565
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18566
      val nonunit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18567
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18568
            val {nextId,clauses,fstLits,sndLits} = nonunit
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18569
            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
 18570
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18571
            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
 18572
            else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18573
              let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18574
                fun predId (id,_) = Metis_IntMap.inDomain id clauses'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18575
                val fstLits = Metis_LiteralNet.filter predId fstLits
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18576
                and sndLits = Metis_LiteralNet.filter predId sndLits
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18577
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18578
                {nextId = nextId, clauses = clauses',
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18579
                 fstLits = fstLits, sndLits = sndLits}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18580
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18581
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18582
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18583
      Metis_Subsume {empty = empty, unit = unit, nonunit = nonunit}
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18584
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18585
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18586
fun toString subsume = "Metis_Subsume{" ^ Int.toString (size subsume) ^ "}";
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18587
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18588
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
 18589
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18590
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18591
(* Subsumption checking.                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18592
(* ------------------------------------------------------------------------- *)
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
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18595
  fun matchLit lit' (lit,acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18596
      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
 18597
        SOME sub => sub :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18598
      | NONE => acc;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18599
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18600
  fun genClauseSubsumes pred cl' lits' cl a =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18601
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18602
        fun mkSubsl acc sub [] = SOME (sub, sortMap length Int.compare acc)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18603
          | mkSubsl acc sub (lit' :: lits') =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18604
            case List.foldl (matchLit lit') [] cl of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18605
              [] => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18606
            | [sub'] =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18607
              (case total (Metis_Subst.union sub) sub' of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18608
                 NONE => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18609
               | SOME sub => mkSubsl acc sub lits')
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18610
            | subs => mkSubsl (subs :: acc) sub lits'
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
        fun search [] = NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18613
          | search ((sub,[]) :: others) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18614
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18615
              val x = (cl',sub,a)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18616
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18617
              if pred x then SOME x else search others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18618
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18619
          | search ((_, [] :: _) :: others) = search others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18620
          | search ((sub, (sub' :: subs) :: subsl) :: others) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18621
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18622
              val others = (sub, subs :: subsl) :: others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18623
            in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18624
              case total (Metis_Subst.union sub) sub' of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18625
                NONE => search others
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18626
              | SOME sub => search ((sub,subsl) :: others)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18627
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18628
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18629
        case mkSubsl [] Metis_Subst.empty lits' of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18630
          NONE => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18631
        | SOME sub_subsl => search [sub_subsl]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18632
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18633
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18634
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18635
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18636
  fun emptySubsumes pred empty = List.find pred empty;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18637
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18638
  fun unitSubsumes pred unit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18639
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18640
        fun subLit lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18641
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18642
              fun subUnit (lit',cl',a) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18643
                  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
 18644
                    NONE => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18645
                  | SOME sub =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18646
                    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18647
                      val x = (cl',sub,a)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18648
                    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18649
                      if pred x then SOME x else NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18650
                    end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18651
            in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18652
              first subUnit (Metis_LiteralNet.match unit lit)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18653
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18654
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18655
        first subLit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18656
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18657
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18658
  fun nonunitSubsumes pred nonunit max cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18659
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18660
        val addId = case max of NONE => idSetAdd | SOME n => idSetAddMax n
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18661
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18662
        fun subLit lits (lit,acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18663
            List.foldl addId acc (Metis_LiteralNet.match lits lit)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18664
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18665
        val {nextId = _, clauses, fstLits, sndLits} = nonunit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18666
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18667
        fun subCl' (id,_) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18668
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18669
              val (lits',cl',a) = Metis_IntMap.get clauses id
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18670
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18671
              genClauseSubsumes pred cl' lits' cl a
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18672
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18673
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18674
        val fstCands = List.foldl (subLit fstLits) idSetEmpty cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18675
        val sndCands = List.foldl (subLit sndLits) idSetEmpty cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18676
        val cands = idSetIntersect fstCands sndCands
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18677
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18678
        Metis_Set.firstl subCl' cands
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18679
      end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18680
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18681
  fun genSubsumes pred (Metis_Subsume {empty,unit,nonunit}) max cl =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18682
      case emptySubsumes pred empty of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18683
        s as SOME _ => s
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18684
      | NONE =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18685
        if max = SOME 0 then NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18686
        else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18687
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18688
            val cl = clauseSym (Metis_LiteralSet.toList cl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18689
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18690
            case unitSubsumes pred unit cl of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18691
              s as SOME _ => s
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18692
            | NONE =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18693
              if max = SOME 1 then NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18694
              else nonunitSubsumes pred nonunit max cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18695
          end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18696
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18697
  fun subsumes pred subsume cl = genSubsumes pred subsume NONE cl;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18698
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18699
  fun strictlySubsumes pred subsume cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18700
      genSubsumes pred subsume (SOME (Metis_LiteralSet.size cl)) cl;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18701
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18702
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18703
(*MetisTrace4
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18704
val subsumes = fn pred => fn subsume => fn cl =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18705
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18706
      val ppCl = Metis_LiteralSet.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18707
      val ppSub = Metis_Subst.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18708
      val () = Metis_Print.trace ppCl "Metis_Subsume.subsumes: cl" cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18709
      val result = subsumes pred subsume cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18710
      val () =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18711
          case result of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18712
            NONE => trace "Metis_Subsume.subsumes: not subsumed\n"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18713
          | SOME (cl,sub,_) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18714
            (Metis_Print.trace ppCl "Metis_Subsume.subsumes: subsuming cl" cl;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18715
             Metis_Print.trace ppSub "Metis_Subsume.subsumes: subsuming sub" sub)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18716
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18717
      result
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18718
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18719
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18720
val strictlySubsumes = fn pred => fn subsume => fn cl =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18721
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18722
      val ppCl = Metis_LiteralSet.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18723
      val ppSub = Metis_Subst.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18724
      val () = Metis_Print.trace ppCl "Metis_Subsume.strictlySubsumes: cl" cl
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 18725
      val result = strictlySubsumes pred subsume cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18726
      val () =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18727
          case result of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18728
            NONE => trace "Metis_Subsume.subsumes: not subsumed\n"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18729
          | SOME (cl,sub,_) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18730
            (Metis_Print.trace ppCl "Metis_Subsume.subsumes: subsuming cl" cl;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18731
             Metis_Print.trace ppSub "Metis_Subsume.subsumes: subsuming sub" sub)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18732
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18733
      result
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18734
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18735
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18736
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18737
fun isSubsumed subs cl = Option.isSome (subsumes (K true) subs cl);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18738
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18739
fun isStrictlySubsumed subs cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18740
    Option.isSome (strictlySubsumes (K true) subs cl);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18741
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18742
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18743
(* Single clause versions.                                                   *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18744
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18745
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18746
fun clauseSubsumes cl' cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18747
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18748
      val lits' = sortClause cl'
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18749
      and lits = clauseSym (Metis_LiteralSet.toList cl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18750
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18751
      case genClauseSubsumes (K true) cl' lits' lits () of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18752
        SOME (_,sub,()) => SOME sub
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18753
      | NONE => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18754
    end;
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
fun clauseStrictlySubsumes cl' cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18757
    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
 18758
    else clauseSubsumes cl' cl;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18759
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18760
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18761
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18762
(**** Original file: src/KnuthBendixOrder.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18763
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18764
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18765
(* THE KNUTH-BENDIX TERM ORDERING                                            *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 18766
(* Copyright (c) 2002 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18767
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18768
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18769
signature Metis_KnuthBendixOrder =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18770
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18771
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18772
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18773
(* 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
 18774
(* one unary function with weight 0.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18775
(* ------------------------------------------------------------------------- *)
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
type kbo =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18778
     {weight : Metis_Term.function -> int,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18779
      precedence : Metis_Term.function * Metis_Term.function -> order}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18780
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18781
val default : kbo
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18782
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18783
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
 18784
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18785
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18786
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18787
(**** Original file: src/KnuthBendixOrder.sml ****)
23442
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
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18790
(* KNUTH-BENDIX TERM ORDERING CONSTRAINTS                                    *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 18791
(* Copyright (c) 2002 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18792
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18793
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18794
structure Metis_KnuthBendixOrder :> Metis_KnuthBendixOrder =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18795
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18796
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18797
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18798
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18799
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18800
(* Helper functions.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18801
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18802
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18803
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
 18804
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18805
fun firstNotEqualTerm f l =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18806
    case List.find notEqualTerm l of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18807
      SOME (x,y) => f x y
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18808
    | NONE => raise Bug "firstNotEqualTerm";
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18809
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18810
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18811
(* 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
 18812
(* one unary function with weight 0.                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18813
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18814
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18815
type kbo =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18816
     {weight : Metis_Term.function -> int,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18817
      precedence : Metis_Term.function * Metis_Term.function -> order};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18818
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18819
(* Default weight = uniform *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18820
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18821
val uniformWeight : Metis_Term.function -> int = K 1;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18822
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18823
(* Default precedence = by arity *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18824
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18825
val arityPrecedence : Metis_Term.function * Metis_Term.function -> order =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18826
    fn ((f1,n1),(f2,n2)) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18827
       case Int.compare (n1,n2) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18828
         LESS => LESS
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18829
       | EQUAL => Metis_Name.compare (f1,f2)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18830
       | GREATER => GREATER;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18831
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18832
(* The default order *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18833
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18834
val default = {weight = uniformWeight, precedence = arityPrecedence};
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
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18837
(* 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
 18838
(* variables in the term (plus a constant).                                  *)
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
(* 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
 18841
(* at least 1, so all weight-1s are at least 0.                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18842
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18843
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18844
datatype weight = Weight of int Metis_NameMap.map * int;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18845
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18846
val weightEmpty : int Metis_NameMap.map = Metis_NameMap.new ();
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18847
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18848
val weightZero = Weight (weightEmpty,0);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18849
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18850
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
 18851
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18852
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
 18853
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18854
local
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18855
  fun add ((_,n1),(_,n2)) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18856
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18857
        val n = n1 + n2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18858
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18859
        if n = 0 then NONE else SOME n
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18860
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18861
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18862
  fun weightAdd (Weight (m1,c1)) (Weight (m2,c2)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18863
      Weight (Metis_NameMap.union add m1 m2, c1 + c2);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18864
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18865
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18866
fun weightSubtract w1 w2 = weightAdd w1 (weightNeg w2);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18867
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18868
fun weightTerm weight =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18869
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18870
      fun wt m c [] = Weight (m,c)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18871
        | wt m c (Metis_Term.Var v :: tms) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18872
          let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18873
            val n = Option.getOpt (Metis_NameMap.peek m v, 0)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18874
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18875
            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
 18876
          end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18877
        | wt m c (Metis_Term.Fn (f,a) :: tms) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18878
          wt m (c + weight (f, length a)) (a @ tms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18879
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18880
      fn tm => wt weightEmpty ~1 [tm]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18881
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18882
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18883
fun weightLowerBound (w as Weight (m,c)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18884
    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
 18885
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18886
(*MetisDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18887
val ppWeightList =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18888
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18889
      fun ppCoeff n =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18890
          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
 18891
          else if n = 1 then Metis_Print.skip
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18892
          else Metis_Print.ppInt n
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18893
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18894
      fun pp_tm (NONE,n) = Metis_Print.ppInt n
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18895
        | 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
 18896
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18897
      fn [] => Metis_Print.ppInt 0
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18898
       | tms => Metis_Print.ppOpList " +" pp_tm tms
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18899
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18900
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18901
fun ppWeight (Weight (m,c)) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18902
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18903
      val l = Metis_NameMap.toList m
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 18904
      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
 18905
      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
 18906
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18907
      ppWeightList l
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18908
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18909
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18910
val weightToString = Metis_Print.toString ppWeight;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18911
*)
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18914
(* The Knuth-Bendix term order.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18915
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18916
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18917
fun compare {weight,precedence} =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18918
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18919
      fun weightDifference tm1 tm2 =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18920
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18921
            val w1 = weightTerm weight tm1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18922
            and w2 = weightTerm weight tm2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18923
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18924
            weightSubtract w2 w1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18925
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18926
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18927
      fun weightLess tm1 tm2 =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18928
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18929
            val w = weightDifference tm1 tm2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18930
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18931
            if weightIsZero w then precedenceLess tm1 tm2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18932
            else weightDiffLess w tm1 tm2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18933
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18934
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18935
      and weightDiffLess w tm1 tm2 =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18936
          case weightLowerBound w of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18937
            NONE => false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18938
          | SOME 0 => precedenceLess tm1 tm2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18939
          | SOME n => n > 0
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18940
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18941
      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
 18942
          (case precedence ((f1, length a1), (f2, length a2)) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18943
             LESS => true
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18944
           | EQUAL => firstNotEqualTerm weightLess (zip a1 a2)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18945
           | GREATER => false)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18946
        | precedenceLess _ _ = false
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 weightDiffGreater w tm1 tm2 = weightDiffLess (weightNeg w) tm2 tm1
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18949
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18950
      fun weightCmp tm1 tm2 =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18951
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18952
            val w = weightDifference tm1 tm2
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18953
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18954
            if weightIsZero w then precedenceCmp tm1 tm2
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18955
            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
 18956
            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
 18957
            else NONE
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18958
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18959
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18960
      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
 18961
          (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
 18962
             LESS => SOME LESS
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18963
           | EQUAL => firstNotEqualTerm weightCmp (zip a1 a2)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18964
           | GREATER => SOME GREATER)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18965
        | precedenceCmp _ _ = raise Bug "kboOrder.precendenceCmp"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18966
    in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18967
      fn (tm1,tm2) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18968
         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
 18969
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18970
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 18971
(*MetisTrace7
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18972
val compare = fn kbo => fn (tm1,tm2) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18973
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18974
      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
 18975
      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
 18976
      val result = compare kbo (tm1,tm2)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18977
      val () =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18978
          case result of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18979
            NONE => trace "Metis_KnuthBendixOrder.compare: result = Incomparable\n"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18980
          | SOME x =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18981
            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
 18982
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18983
      result
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18984
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18985
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18986
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
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 18989
(**** Original file: src/Rewrite.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18990
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18991
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18992
(* ORDERED REWRITING FOR FIRST ORDER TERMS                                   *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 18993
(* Copyright (c) 2003 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18994
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18995
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 18996
signature Metis_Rewrite =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18997
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18998
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 18999
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19000
(* Orientations of equations.                                                *)
23442
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19003
datatype orient = LeftToRight | RightToLeft
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19004
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19005
val toStringOrient : orient -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19006
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19007
val ppOrient : orient Metis_Print.pp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19008
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19009
val toStringOrientOption : orient option -> string
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19010
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19011
val ppOrientOption : orient option Metis_Print.pp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19012
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19013
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19014
(* A type of rewrite systems.                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19015
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19016
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19017
type reductionOrder = Metis_Term.term * Metis_Term.term -> order option
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19018
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19019
type equationId = int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19020
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19021
type equation = Metis_Rule.equation
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19022
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19023
type rewrite
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19024
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19025
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19026
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19027
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19028
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19029
val new : reductionOrder -> rewrite
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19030
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19031
val peek : rewrite -> equationId -> (equation * orient option) option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19032
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19033
val size : rewrite -> int
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
val equations : rewrite -> equation list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19036
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19037
val toString : rewrite -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19038
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19039
val pp : rewrite Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19040
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19041
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19042
(* Add equations into the system.                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19043
(* ------------------------------------------------------------------------- *)
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
val add : rewrite -> equationId * equation -> rewrite
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19046
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19047
val addList : rewrite -> (equationId * equation) list -> rewrite
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19048
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19049
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19050
(* Rewriting (the order must be a refinement of the rewrite order).          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19051
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19052
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19053
val rewrConv : rewrite -> reductionOrder -> Metis_Rule.conv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19054
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19055
val rewriteConv : rewrite -> reductionOrder -> Metis_Rule.conv
23442
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
val rewriteLiteralsRule :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19058
    rewrite -> reductionOrder -> Metis_LiteralSet.set -> Metis_Rule.rule
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19059
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19060
val rewriteRule : rewrite -> reductionOrder -> Metis_Rule.rule
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19061
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19062
val rewrIdConv : rewrite -> reductionOrder -> equationId -> Metis_Rule.conv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19063
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19064
val rewriteIdConv : rewrite -> reductionOrder -> equationId -> Metis_Rule.conv
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19065
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19066
val rewriteIdLiteralsRule :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19067
    rewrite -> reductionOrder -> equationId -> Metis_LiteralSet.set -> Metis_Rule.rule
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19068
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19069
val rewriteIdRule : rewrite -> reductionOrder -> equationId -> Metis_Rule.rule
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19070
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
(* Inter-reduce the equations in the system.                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19073
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19074
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19075
val reduce' : rewrite -> rewrite * equationId list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19076
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19077
val reduce : rewrite -> rewrite
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19078
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19079
val isReduced : rewrite -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19080
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19081
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19082
(* Rewriting as a derived rule.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19083
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19084
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19085
val rewrite : equation list -> Metis_Thm.thm -> Metis_Thm.thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19086
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19087
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
 19088
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19089
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19090
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19091
(**** Original file: src/Rewrite.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19092
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19093
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19094
(* ORDERED REWRITING FOR FIRST ORDER TERMS                                   *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19095
(* Copyright (c) 2003 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19096
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19097
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19098
structure Metis_Rewrite :> Metis_Rewrite =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19099
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19100
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19101
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19102
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19103
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19104
(* Orientations of equations.                                                *)
23442
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19107
datatype orient = LeftToRight | RightToLeft;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19108
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19109
fun toStringOrient ort =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19110
    case ort of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19111
      LeftToRight => "-->"
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19112
    | RightToLeft => "<--";
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19113
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19114
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
 19115
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19116
fun toStringOrientOption orto =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19117
    case orto of
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19118
      SOME ort => toStringOrient ort
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19119
    | NONE => "<->";
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19120
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19121
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
 19122
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19123
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19124
(* A type of rewrite systems.                                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19125
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19126
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19127
type reductionOrder = Metis_Term.term * Metis_Term.term -> order option;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19128
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19129
type equationId = int;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19130
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19131
type equation = Metis_Rule.equation;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19132
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19133
datatype rewrite =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19134
    Metis_Rewrite of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19135
      {order : reductionOrder,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19136
       known : (equation * orient option) Metis_IntMap.map,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19137
       redexes : (equationId * orient) Metis_TermNet.termNet,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19138
       subterms : (equationId * bool * Metis_Term.path) Metis_TermNet.termNet,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19139
       waiting : Metis_IntSet.set};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19140
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19141
fun updateWaiting rw waiting =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19142
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19143
      val Metis_Rewrite {order, known, redexes, subterms, waiting = _} = rw
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19144
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19145
      Metis_Rewrite
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19146
        {order = order, known = known, redexes = redexes,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19147
         subterms = subterms, waiting = waiting}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19148
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19149
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19150
fun deleteWaiting (rw as Metis_Rewrite {waiting,...}) id =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19151
    updateWaiting rw (Metis_IntSet.delete waiting id);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19152
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19153
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19154
(* Basic operations                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19155
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19156
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19157
fun new order =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19158
    Metis_Rewrite
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19159
      {order = order,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19160
       known = Metis_IntMap.new (),
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19161
       redexes = Metis_TermNet.new {fifo = false},
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19162
       subterms = Metis_TermNet.new {fifo = false},
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19163
       waiting = Metis_IntSet.empty};
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19164
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19165
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
 19166
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19167
fun size (Metis_Rewrite {known,...}) = Metis_IntMap.size known;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19168
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19169
fun equations (Metis_Rewrite {known,...}) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19170
    Metis_IntMap.foldr (fn (_,(eqn,_),eqns) => eqn :: eqns) [] known;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19171
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19172
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
 19173
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19174
(*MetisTrace1
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19175
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19176
  fun ppEq ((x_y,_),ort) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19177
      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
 19178
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19179
  fun ppField f ppA a =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 19180
      Metis_Print.inconsistentBlock 2
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19181
        [Metis_Print.ppString (f ^ " ="),
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 19182
         Metis_Print.break,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19183
         ppA a];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19184
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19185
  val ppKnown =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19186
      ppField "known"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19187
        (Metis_Print.ppMap Metis_IntMap.toList
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19188
           (Metis_Print.ppList (Metis_Print.ppPair Metis_Print.ppInt ppEq)));
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19189
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19190
  val ppRedexes =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19191
      ppField "redexes"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19192
        (Metis_TermNet.pp (Metis_Print.ppPair Metis_Print.ppInt ppOrient));
23442
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
  val ppSubterms =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19195
      ppField "subterms"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19196
        (Metis_TermNet.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19197
           (Metis_Print.ppMap
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19198
              (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
 19199
              (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
 19200
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19201
  val ppWaiting =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19202
      ppField "waiting"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19203
        (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
 19204
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19205
  fun pp (Metis_Rewrite {known,redexes,subterms,waiting,...}) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 19206
      Metis_Print.inconsistentBlock 2
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19207
        [Metis_Print.ppString "Metis_Rewrite",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 19208
         Metis_Print.break,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 19209
         Metis_Print.inconsistentBlock 1
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19210
           [Metis_Print.ppString "{",
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19211
            ppKnown known,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19212
(*MetisTrace5
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19213
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 19214
            Metis_Print.break,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19215
            ppRedexes redexes,
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19216
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 19217
            Metis_Print.break,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19218
            ppSubterms subterms,
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19219
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 19220
            Metis_Print.break,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19221
            ppWaiting waiting,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19222
*)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19223
            Metis_Print.skip],
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19224
         Metis_Print.ppString "}"]
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19225
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19226
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19227
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19228
val toString = Metis_Print.toString pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19229
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19230
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19231
(* Debug functions.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19232
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19233
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19234
fun termReducible order known id =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19235
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19236
      fun eqnRed ((l,r),_) tm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19237
          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
 19238
            NONE => false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19239
          | SOME sub =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19240
            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
 19241
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19242
      fun knownRed tm (eqnId,(eqn,ort)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19243
          eqnId <> id andalso
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19244
          ((ort <> SOME RightToLeft andalso eqnRed eqn tm) orelse
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19245
           (ort <> SOME LeftToRight andalso eqnRed (Metis_Rule.symEqn eqn) tm))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19246
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19247
      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
 19248
      and subtermRed (Metis_Term.Var _) = false
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19249
        | subtermRed (Metis_Term.Fn (_,tms)) = List.exists termRed tms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19250
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19251
      termRed
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19252
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19253
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19254
fun literalReducible order known id lit =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19255
    List.exists (termReducible order known id) (Metis_Literal.arguments lit);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19256
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19257
fun literalsReducible order known id lits =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19258
    Metis_LiteralSet.exists (literalReducible order known id) lits;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19259
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19260
fun thmReducible order known id th =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19261
    literalsReducible order known id (Metis_Thm.clause th);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19262
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19263
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19264
(* Add equations into the system.                                            *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19265
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19266
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19267
fun orderToOrient (SOME EQUAL) = raise Error "Metis_Rewrite.orient: reflexive"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19268
  | orderToOrient (SOME GREATER) = SOME LeftToRight
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19269
  | orderToOrient (SOME LESS) = SOME RightToLeft
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19270
  | orderToOrient NONE = NONE;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19271
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19272
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19273
  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
 19274
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19275
  fun addRedexes id (((l,r),_),ort) redexes =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19276
      case ort of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19277
        SOME LeftToRight => ins redexes l id LeftToRight
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19278
      | SOME RightToLeft => ins redexes r id RightToLeft
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19279
      | NONE => ins (ins redexes l id LeftToRight) r id RightToLeft;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19280
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19281
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19282
fun add (rw as Metis_Rewrite {known,...}) (id,eqn) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19283
    if Metis_IntMap.inDomain id known then rw
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19284
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19285
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19286
        val Metis_Rewrite {order,redexes,subterms,waiting, ...} = rw
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19287
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19288
        val ort = orderToOrient (order (fst eqn))
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19289
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19290
        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
 19291
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19292
        val redexes = addRedexes id (eqn,ort) redexes
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19293
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19294
        val waiting = Metis_IntSet.add waiting id
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19295
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19296
        val rw =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19297
            Metis_Rewrite
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19298
              {order = order, known = known, redexes = redexes,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19299
               subterms = subterms, waiting = waiting}
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19300
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19301
        val () = Metis_Print.trace pp "Metis_Rewrite.add: result" rw
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19302
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19303
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19304
        rw
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19305
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19306
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19307
local
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19308
  fun uncurriedAdd (eqn,rw) = add rw eqn;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19309
in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19310
  fun addList rw = List.foldl uncurriedAdd rw;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19311
end;
23442
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
(* ------------------------------------------------------------------------- *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19314
(* Rewriting (the supplied order must be a refinement of the rewrite order). *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19315
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19316
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19317
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19318
  fun reorder ((i,_),(j,_)) = Int.compare (j,i);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19319
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19320
  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
 19321
end;
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
fun wellOriented NONE _ = true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19324
  | wellOriented (SOME LeftToRight) LeftToRight = true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19325
  | wellOriented (SOME RightToLeft) RightToLeft = true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19326
  | wellOriented _ _ = false;
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
fun redexResidue LeftToRight ((l_r,_) : equation) = l_r
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19329
  | redexResidue RightToLeft ((l,r),_) = (r,l);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19330
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19331
fun orientedEquation LeftToRight eqn = eqn
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19332
  | orientedEquation RightToLeft eqn = Metis_Rule.symEqn eqn;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19333
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19334
fun rewrIdConv' order known redexes id tm =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19335
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19336
      fun rewr (id',lr) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19337
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19338
            val _ = id <> id' orelse raise Error "same theorem"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19339
            val (eqn,ort) = Metis_IntMap.get known id'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19340
            val _ = wellOriented ort lr orelse raise Error "orientation"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19341
            val (l,r) = redexResidue lr eqn
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19342
            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
 19343
            val tm' = Metis_Subst.subst sub r
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19344
            val _ = Option.isSome ort orelse
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19345
                    order (tm,tm') = SOME GREATER orelse
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19346
                    raise Error "order"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19347
            val (_,th) = orientedEquation lr eqn
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19348
          in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19349
            (tm', Metis_Thm.subst sub th)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19350
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19351
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19352
      case first (total rewr) (matchingRedexes redexes tm) of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19353
        NONE => raise Error "Metis_Rewrite.rewrIdConv: no matching rewrites"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19354
      | SOME res => res
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19355
    end;
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
fun rewriteIdConv' order known redexes id =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19358
    if Metis_IntMap.null known then Metis_Rule.allConv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19359
    else Metis_Rule.repeatTopDownConv (rewrIdConv' order known redexes id);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19360
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19361
fun mkNeqConv order lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19362
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19363
      val (l,r) = Metis_Literal.destNeq lit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19364
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19365
      case order (l,r) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19366
        NONE => raise Error "incomparable"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19367
      | SOME LESS =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19368
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19369
          val th = Metis_Rule.symmetryRule l r
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19370
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19371
          fn tm =>
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19372
             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
 19373
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19374
      | SOME EQUAL => raise Error "irreflexive"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19375
      | SOME GREATER =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19376
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19377
          val th = Metis_Thm.assume lit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19378
        in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19379
          fn tm =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19380
             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
 19381
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19382
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19383
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19384
datatype neqConvs = NeqConvs of Metis_Rule.conv list;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19385
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19386
val neqConvsEmpty = NeqConvs [];
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19387
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19388
fun neqConvsNull (NeqConvs l) = List.null l;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19389
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19390
fun neqConvsAdd order (neq as NeqConvs l) lit =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19391
    case total (mkNeqConv order) lit of
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19392
      NONE => neq
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19393
    | SOME conv => NeqConvs (conv :: l);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19394
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19395
fun mkNeqConvs order =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19396
    let
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19397
      fun add (lit,neq) = neqConvsAdd order neq lit
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19398
    in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19399
      Metis_LiteralSet.foldl add neqConvsEmpty
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19400
    end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19401
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19402
fun buildNeqConvs order lits =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19403
    let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19404
      fun add (lit,(neq,neqs)) = (neqConvsAdd order neq lit, (lit,neq) :: neqs)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19405
    in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19406
      snd (Metis_LiteralSet.foldl add (neqConvsEmpty,[]) lits)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19407
    end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19408
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19409
fun neqConvsToConv (NeqConvs l) = Metis_Rule.firstConv l;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19410
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19411
fun neqConvsUnion (NeqConvs l1) (NeqConvs l2) =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19412
    NeqConvs (List.revAppend (l1,l2));
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19413
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19414
fun neqConvsRewrIdLiterule order known redexes id neq =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19415
    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
 19416
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19417
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19418
        val neq_conv = neqConvsToConv neq
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19419
        val rewr_conv = rewrIdConv' order known redexes id
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19420
        val conv = Metis_Rule.orelseConv neq_conv rewr_conv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19421
        val conv = Metis_Rule.repeatTopDownConv conv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19422
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19423
        Metis_Rule.allArgumentsLiterule conv
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19424
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19425
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19426
fun rewriteIdEqn' order known redexes id (eqn as (l_r,th)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19427
    let
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19428
      val neq = mkNeqConvs order (Metis_Thm.clause th)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19429
      val literule = neqConvsRewrIdLiterule order known redexes id neq
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19430
      val (strongEqn,lit) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19431
          case Metis_Rule.equationLiteral eqn of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19432
            NONE => (true, Metis_Literal.mkEq l_r)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19433
          | SOME lit => (false,lit)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19434
      val (lit',litTh) = literule lit
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19435
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19436
      if Metis_Literal.equal lit lit' then eqn
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19437
      else
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19438
        (Metis_Literal.destEq lit',
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19439
         if strongEqn then th
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19440
         else if not (Metis_Thm.negateMember lit litTh) then litTh
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19441
         else Metis_Thm.resolve lit th litTh)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19442
    end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19443
(*MetisDebug
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19444
    handle Error err => raise Error ("Metis_Rewrite.rewriteIdEqn':\n" ^ err);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19445
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19446
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19447
fun rewriteIdLiteralsRule' order known redexes id lits th =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19448
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19449
      val mk_literule = neqConvsRewrIdLiterule order known redexes id
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19450
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19451
      fun rewr_neq_lit ((lit,rneq),(changed,lneq,lits,th)) =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19452
          let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19453
            val neq = neqConvsUnion lneq rneq
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19454
            val (lit',litTh) = mk_literule neq lit
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19455
            val lneq = neqConvsAdd order lneq lit'
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19456
            val lits = Metis_LiteralSet.add lits lit'
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19457
          in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19458
            if Metis_Literal.equal lit lit' then (changed,lneq,lits,th)
74358
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 19459
            else (true, lneq, lits,
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 19460
                  if Metis_Thm.member lit th then Metis_Thm.resolve lit th litTh else th)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19461
          end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19462
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19463
      fun rewr_neq_lits lits th =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19464
          let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19465
            val neqs = buildNeqConvs order lits
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19466
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19467
            val neq = neqConvsEmpty
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19468
            val lits = Metis_LiteralSet.empty
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19469
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19470
            val (changed,neq,lits,th) =
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19471
                List.foldl rewr_neq_lit (false,neq,lits,th) neqs
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19472
          in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19473
            if changed then rewr_neq_lits lits th else (neq,th)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19474
          end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19475
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19476
      val (neq,lits) = Metis_LiteralSet.partition Metis_Literal.isNeq lits
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19477
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19478
      val (neq,th) = rewr_neq_lits neq th
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19479
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19480
      val rewr_literule = mk_literule neq
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
      fun rewr_lit (lit,th) =
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19483
          if not (Metis_Thm.member lit th) then th
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19484
          else Metis_Rule.literalRule rewr_literule lit th
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19485
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19486
      Metis_LiteralSet.foldl rewr_lit th lits
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19487
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19488
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19489
fun rewriteIdRule' order known redexes id th =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19490
    rewriteIdLiteralsRule' order known redexes id (Metis_Thm.clause th) th;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19491
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19492
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19493
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
 19494
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19495
(*MetisTrace6
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19496
      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
 19497
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19498
      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
 19499
(*MetisTrace6
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19500
      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
 19501
*)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19502
      val () = if not (thmReducible order known id result) then ()
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19503
               else raise Bug "Metis_Rewrite.rewriteIdRule': should be normalized"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19504
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19505
      result
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19506
    end
74358
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 19507
    handle Error err =>
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 19508
      raise Error ("Metis_Rewrite.rewriteIdRule':\n" ^
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 19509
                   "th = " ^ Metis_Thm.toString th ^ "\n" ^ err)
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 19510
         | Bug bug =>
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 19511
      raise Bug ("Metis_Rewrite.rewriteIdRule':\n" ^
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 19512
                 "th = " ^ Metis_Thm.toString th ^ "\n" ^ bug);
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19513
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19514
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19515
fun rewrIdConv (Metis_Rewrite {known,redexes,...}) order =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19516
    rewrIdConv' order known redexes;
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
fun rewrConv rewrite order = rewrIdConv rewrite order ~1;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19519
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19520
fun rewriteIdConv (Metis_Rewrite {known,redexes,...}) order =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19521
    rewriteIdConv' order known redexes;
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
fun rewriteConv rewrite order = rewriteIdConv rewrite order ~1;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19524
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19525
fun rewriteIdLiteralsRule (Metis_Rewrite {known,redexes,...}) order =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19526
    rewriteIdLiteralsRule' order known redexes;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19527
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19528
fun rewriteLiteralsRule rewrite order =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19529
    rewriteIdLiteralsRule rewrite order ~1;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19530
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19531
fun rewriteIdRule (Metis_Rewrite {known,redexes,...}) order =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19532
    rewriteIdRule' order known redexes;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19533
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19534
(*MetisDebug
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19535
val rewriteIdRule = fn rewr => fn order => fn id => fn th =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19536
    let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19537
      val result = rewriteIdRule rewr order id th
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19538
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19539
      val th' = rewriteIdRule rewr order id result
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19540
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19541
      val () = if Metis_Thm.equal th' result then ()
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19542
               else
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19543
                 let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19544
                   fun trace p s = Metis_Print.trace p ("Metis_Rewrite.rewriteIdRule: "^s)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19545
                   val () = trace pp "rewr" rewr
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19546
                   val () = trace Metis_Thm.pp "th" th
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19547
                   val () = trace Metis_Thm.pp "result" result
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19548
                   val () = trace Metis_Thm.pp "th'" th'
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19549
                in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19550
                  raise Bug "Metis_Rewrite.rewriteIdRule: should be idempotent"
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19551
                end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19552
    in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19553
      result
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19554
    end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19555
    handle Error err => raise Error ("Metis_Rewrite.rewriteIdRule:\n" ^ err);
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19556
*)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19557
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19558
fun rewriteRule rewrite order = rewriteIdRule rewrite order ~1;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19559
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
(* Inter-reduce the equations in the system.                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19562
(* ------------------------------------------------------------------------- *)
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
fun addSubterms id (((l,r),_) : equation) subterms =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19565
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19566
      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
 19567
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19568
      val subterms = List.foldl (addSubterm true) subterms (Metis_Term.subterms l)
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19569
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19570
      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
 19571
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19572
      subterms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19573
    end;
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
fun sameRedexes NONE _ _ = false
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19576
  | sameRedexes (SOME LeftToRight) (l0,_) (l,_) = Metis_Term.equal l0 l
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19577
  | sameRedexes (SOME RightToLeft) (_,r0) (_,r) = Metis_Term.equal r0 r;
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
fun redexResidues NONE (l,r) = [(l,r,false),(r,l,false)]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19580
  | redexResidues (SOME LeftToRight) (l,r) = [(l,r,true)]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19581
  | redexResidues (SOME RightToLeft) (l,r) = [(r,l,true)];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19582
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19583
fun findReducibles order known subterms id =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19584
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19585
      fun checkValidRewr (l,r,ord) id' left path =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19586
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19587
            val (((x,y),_),_) = Metis_IntMap.get known id'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19588
            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
 19589
            val sub = Metis_Subst.match Metis_Subst.empty l tm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19590
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19591
            if ord then ()
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19592
            else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19593
              let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19594
                val tm' = Metis_Subst.subst (Metis_Subst.normalize sub) r
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19595
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19596
                if order (tm,tm') = SOME GREATER then ()
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19597
                else raise Error "order"
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19598
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19599
          end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19600
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19601
      fun addRed lr ((id',left,path),todo) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19602
          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
 19603
             can (checkValidRewr lr id' left) path
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19604
          then Metis_IntSet.add todo id'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19605
          else todo
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19606
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19607
      fun findRed (lr as (l,_,_), todo) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19608
          List.foldl (addRed lr) todo (Metis_TermNet.matched subterms l)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19609
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19610
      List.foldl findRed
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19611
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19612
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19613
fun reduce1 new id (eqn0,ort0) (rpl,spl,todo,rw,changed) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19614
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19615
      val (eq0,_) = eqn0
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19616
      val Metis_Rewrite {order,known,redexes,subterms,waiting} = rw
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19617
      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
 19618
      val identical =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19619
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19620
            val (l0,r0) = eq0
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19621
            and (l,r) = eq
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19622
          in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19623
            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
 19624
          end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19625
      val same_redexes = identical orelse sameRedexes ort0 eq0 eq
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19626
      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
 19627
      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
 19628
      val changed =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19629
          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
 19630
      val ort =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19631
          if same_redexes then SOME ort0 else total orderToOrient (order eq)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19632
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19633
      case ort of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19634
        NONE =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19635
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19636
          val known = Metis_IntMap.delete known id
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19637
          val rw =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19638
              Metis_Rewrite
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19639
                {order = order, known = known, redexes = redexes,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19640
                 subterms = subterms, waiting = waiting}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19641
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19642
          (rpl,spl,todo,rw,changed)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19643
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19644
      | SOME ort =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19645
        let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19646
          val todo =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19647
              if not new andalso same_redexes then todo
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19648
              else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19649
                findReducibles
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19650
                  order known subterms id todo (redexResidues ort eq)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19651
          val known =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19652
              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
 19653
          val redexes =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19654
              if same_redexes then redexes
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19655
              else addRedexes id (eqn,ort) redexes
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19656
          val subterms =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19657
              if new orelse not identical then addSubterms id eqn subterms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19658
              else subterms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19659
          val rw =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19660
              Metis_Rewrite
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19661
                {order = order, known = known, redexes = redexes,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19662
                 subterms = subterms, waiting = waiting}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19663
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19664
          (rpl,spl,todo,rw,changed)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19665
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19666
    end;
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
fun pick known set =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19669
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19670
      fun oriented id =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19671
          case Metis_IntMap.peek known id of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19672
            SOME (x as (_, SOME _)) => SOME (id,x)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19673
          | _ => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19674
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19675
      fun any id =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19676
          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
 19677
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19678
      case Metis_IntSet.firstl oriented set of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19679
        x as SOME _ => x
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19680
      | NONE => Metis_IntSet.firstl any set
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19681
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19682
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19683
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19684
  fun cleanRedexes known redexes rpl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19685
      if Metis_IntSet.null rpl then redexes
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19686
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19687
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19688
          fun filt (id,_) = not (Metis_IntSet.member id rpl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19689
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19690
          fun addReds (id,reds) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19691
              case Metis_IntMap.peek known id of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19692
                NONE => reds
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19693
              | 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
 19694
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19695
          val redexes = Metis_TermNet.filter filt redexes
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19696
          val redexes = Metis_IntSet.foldl addReds redexes rpl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19697
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19698
          redexes
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19699
        end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19700
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19701
  fun cleanSubterms known subterms spl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19702
      if Metis_IntSet.null spl then subterms
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19703
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19704
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19705
          fun filt (id,_,_) = not (Metis_IntSet.member id spl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19706
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19707
          fun addSubtms (id,subtms) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19708
              case Metis_IntMap.peek known id of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19709
                NONE => subtms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19710
              | SOME (eqn,_) => addSubterms id eqn subtms
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19711
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19712
          val subterms = Metis_TermNet.filter filt subterms
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19713
          val subterms = Metis_IntSet.foldl addSubtms subterms spl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19714
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19715
          subterms
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19716
        end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19717
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19718
  fun rebuild rpl spl rw =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19719
      let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19720
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19721
        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
 19722
        val () = Metis_Print.trace ppPl "Metis_Rewrite.rebuild: rpl" rpl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19723
        val () = Metis_Print.trace ppPl "Metis_Rewrite.rebuild: spl" spl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19724
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19725
        val Metis_Rewrite {order,known,redexes,subterms,waiting} = rw
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19726
        val redexes = cleanRedexes known redexes rpl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19727
        val subterms = cleanSubterms known subterms spl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19728
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19729
        Metis_Rewrite
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19730
          {order = order,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19731
           known = known,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19732
           redexes = redexes,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19733
           subterms = subterms,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19734
           waiting = waiting}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19735
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19736
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19737
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19738
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
 19739
    case pick known todo of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19740
      SOME (id,eqn_ort) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19741
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19742
        val todo = Metis_IntSet.delete todo id
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19743
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19744
        reduceAcc (reduce1 false id eqn_ort (rpl,spl,todo,rw,changed))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19745
      end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19746
    | NONE =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19747
      case pick known waiting of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19748
        SOME (id,eqn_ort) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19749
        let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19750
          val rw = deleteWaiting rw id
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19751
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19752
          reduceAcc (reduce1 true id eqn_ort (rpl,spl,todo,rw,changed))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19753
        end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19754
      | NONE => (rebuild rpl spl rw, Metis_IntSet.toList changed);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19755
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19756
fun isReduced (Metis_Rewrite {waiting,...}) = Metis_IntSet.null waiting;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19757
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19758
fun reduce' rw =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19759
    if isReduced rw then (rw,[])
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19760
    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
 19761
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19762
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19763
val reduce' = fn rw =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19764
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 19765
(*MetisTrace4
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19766
      val () = Metis_Print.trace pp "Metis_Rewrite.reduce': rw" rw
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19767
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19768
      val Metis_Rewrite {known,order,...} = rw
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19769
      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
 19770
(*MetisTrace4
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19771
      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
 19772
      val () = Metis_Print.trace ppResult "Metis_Rewrite.reduce': result" result
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19773
*)
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19774
      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
 19775
      val _ =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19776
          not (List.exists (uncurry (thmReducible order known')) ths) orelse
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19777
          raise Bug "Metis_Rewrite.reduce': not fully reduced"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19778
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19779
      result
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19780
    end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19781
    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
 19782
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19783
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19784
fun reduce rw = fst (reduce' rw);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19785
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19786
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19787
(* Rewriting as a derived rule.                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19788
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19789
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19790
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19791
  fun addEqn (id_eqn,rw) = add rw id_eqn;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19792
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19793
  fun orderedRewrite order ths =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19794
    let
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19795
      val rw = List.foldl addEqn (new order) (enumerate ths)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19796
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19797
      rewriteRule rw order
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19798
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19799
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19800
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19801
local
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19802
  val order : reductionOrder = K (SOME GREATER);
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19803
in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19804
  val rewrite = orderedRewrite order;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 19805
end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19806
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19807
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19808
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19809
(**** Original file: src/Units.sig ****)
23442
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
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19812
(* A STORE FOR UNIT THEOREMS                                                 *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19813
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19814
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19815
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19816
signature Metis_Units =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19817
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19818
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19819
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19820
(* A type of unit store.                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19821
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19822
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19823
type unitThm = Metis_Literal.literal * Metis_Thm.thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19824
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19825
type units
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
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19829
(* ------------------------------------------------------------------------- *)
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
val empty : units
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19832
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19833
val size : units -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19834
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19835
val toString : units -> string
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19836
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19837
val pp : units Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19838
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19839
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19840
(* Add units into the store.                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19841
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19842
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19843
val add : units -> unitThm -> units
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19844
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19845
val addList : units -> unitThm list -> units
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19846
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19847
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19848
(* Matching.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19849
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19850
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19851
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
 19852
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19853
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19854
(* Reducing by repeated matching and resolution.                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19855
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19856
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19857
val reduce : units -> Metis_Rule.rule
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19858
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19859
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19860
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19861
(**** Original file: src/Units.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19862
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19863
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19864
(* A STORE FOR UNIT THEOREMS                                                 *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19865
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19866
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19867
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19868
structure Metis_Units :> Metis_Units =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19869
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19870
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19871
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19872
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
(* A type of unit store.                                                     *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19875
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19876
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19877
type unitThm = Metis_Literal.literal * Metis_Thm.thm;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19878
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19879
datatype units = Metis_Units of unitThm Metis_LiteralNet.literalNet;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19880
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19881
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19882
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19883
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19884
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19885
val empty = Metis_Units (Metis_LiteralNet.new {fifo = false});
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19886
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19887
fun size (Metis_Units net) = Metis_LiteralNet.size net;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19888
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19889
fun toString units = "U{" ^ Int.toString (size units) ^ "}";
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19890
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19891
val pp = Metis_Print.ppMap toString Metis_Print.ppString;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19892
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19893
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19894
(* Add units into the store.                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19895
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19896
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19897
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
 19898
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19899
      val net = Metis_LiteralNet.insert net (lit,uTh)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19900
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19901
      case total Metis_Literal.sym lit of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19902
        NONE => Metis_Units net
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19903
      | SOME (lit' as (pol,_)) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19904
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19905
          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
 19906
          val net = Metis_LiteralNet.insert net (lit',(lit',th'))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19907
        in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19908
          Metis_Units net
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19909
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19910
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19911
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19912
val addList = List.foldl (fn (th,u) => add u th);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19913
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19914
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19915
(* Matching.                                                                 *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19916
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19917
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19918
fun match (Metis_Units net) lit =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19919
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19920
      fun check (uTh as (lit',_)) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19921
          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
 19922
            NONE => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19923
          | SOME sub => SOME (uTh,sub)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19924
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19925
      first check (Metis_LiteralNet.match net lit)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19926
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19927
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19928
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19929
(* Reducing by repeated matching and resolution.                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19930
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19931
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19932
fun reduce units =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19933
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19934
      fun red1 (lit,news_th) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19935
          case total Metis_Literal.destIrrefl lit of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19936
            SOME tm =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19937
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19938
              val (news,th) = news_th
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19939
              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
 19940
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19941
              (news,th)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19942
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19943
          | NONE =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19944
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19945
              val lit' = Metis_Literal.negate lit
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19946
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19947
              case match units lit' of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19948
                NONE => news_th
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19949
              | SOME ((_,rth),sub) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19950
                let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19951
                  val (news,th) = news_th
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19952
                  val rth = Metis_Thm.subst sub rth
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19953
                  val th = Metis_Thm.resolve lit th rth
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19954
                  val new = Metis_LiteralSet.delete (Metis_Thm.clause rth) lit'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19955
                  val news = Metis_LiteralSet.union new news
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19956
                in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19957
                  (news,th)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19958
                end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19959
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19960
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19961
      fun red (news,th) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19962
          if Metis_LiteralSet.null news then th
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19963
          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
 19964
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19965
      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
 19966
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19967
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19968
end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19969
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 19970
(**** Original file: src/Clause.sig ****)
23442
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
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19973
(* CLAUSE = ID + THEOREM                                                     *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 19974
(* Copyright (c) 2002 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19975
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19976
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19977
signature Metis_Clause =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19978
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19979
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
(* A type of clause.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19982
(* ------------------------------------------------------------------------- *)
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
datatype literalOrder =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19985
    NoLiteralOrder
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19986
  | UnsignedLiteralOrder
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19987
  | PositiveLiteralOrder
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
type parameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19990
     {ordering : Metis_KnuthBendixOrder.kbo,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19991
      orderLiterals : literalOrder,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19992
      orderTerms : bool}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19993
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19994
type clauseId = int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19995
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 19996
type clauseInfo = {parameters : parameters, id : clauseId, thm : Metis_Thm.thm}
23442
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
type clause
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 19999
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
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20002
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20003
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20004
val default : parameters
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
val newId : unit -> clauseId
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20007
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20008
val mk : clauseInfo -> clause
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20009
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20010
val dest : clause -> clauseInfo
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20011
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20012
val id : clause -> clauseId
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20013
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20014
val thm : clause -> Metis_Thm.thm
23442
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
val equalThms : clause -> clause -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20017
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20018
val literals : clause -> Metis_Thm.clause
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20019
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20020
val isTautology : clause -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20021
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20022
val isContradiction : clause -> bool
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20023
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20024
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20025
(* The term ordering is used to cut down inferences.                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20026
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20027
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20028
val largestLiterals : clause -> Metis_LiteralSet.set
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20029
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20030
val largestEquations :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20031
    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
 20032
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20033
val largestSubterms :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20034
    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
 20035
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20036
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
 20037
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20038
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20039
(* Subsumption.                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20040
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20041
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20042
val subsumes : clause Metis_Subsume.subsume -> clause -> bool
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20043
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20044
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20045
(* Simplifying rules: these preserve the clause id.                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20046
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20047
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20048
val freshVars : clause -> clause
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20049
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20050
val simplify : clause -> clause option
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20051
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20052
val reduce : Metis_Units.units -> clause -> clause
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20053
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20054
val rewrite : Metis_Rewrite.rewrite -> clause -> clause
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20055
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20056
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20057
(* Inference rules: these generate new clause ids.                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20058
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20059
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20060
val factor : clause -> clause list
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20061
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20062
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
 20063
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20064
val paramodulate :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20065
    clause * Metis_Literal.literal * Metis_Rewrite.orient * Metis_Term.term ->
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20066
    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
 20067
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20068
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20069
(* Pretty printing.                                                          *)
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
32740
9dd0a2f83429 explicit indication of Unsynchronized.ref;
wenzelm
parents: 30161
diff changeset
 20072
val showId : bool Unsynchronized.ref
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20073
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20074
val pp : clause Metis_Print.pp
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20075
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20076
val toString : clause -> string
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20077
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20078
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20079
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20080
(**** Original file: src/Clause.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20081
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20082
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20083
(* CLAUSE = ID + THEOREM                                                     *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20084
(* Copyright (c) 2002 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20085
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20086
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20087
structure Metis_Clause :> Metis_Clause =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20088
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20089
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20090
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20091
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20092
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20093
(* Helper functions.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20094
(* ------------------------------------------------------------------------- *)
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
val newId =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20097
    let
32740
9dd0a2f83429 explicit indication of Unsynchronized.ref;
wenzelm
parents: 30161
diff changeset
 20098
      val r = Unsynchronized.ref 0
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20099
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20100
      fun new () =
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20101
          let
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20102
            val Unsynchronized.ref n = r
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20103
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20104
            val () = r := n + 1
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20105
          in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20106
            n
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20107
          end
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20108
    in
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20109
      fn () => Metis_Portable.critical new ()
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20110
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20111
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20112
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20113
(* A type of clause.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20114
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20115
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20116
datatype literalOrder =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20117
    NoLiteralOrder
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20118
  | UnsignedLiteralOrder
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20119
  | PositiveLiteralOrder;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20120
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20121
type parameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20122
     {ordering : Metis_KnuthBendixOrder.kbo,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20123
      orderLiterals : literalOrder,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20124
      orderTerms : bool};
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
type clauseId = int;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20127
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20128
type clauseInfo = {parameters : parameters, id : clauseId, thm : Metis_Thm.thm};
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20129
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20130
datatype clause = Metis_Clause of clauseInfo;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20131
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20132
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20133
(* Pretty printing.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20134
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20135
32740
9dd0a2f83429 explicit indication of Unsynchronized.ref;
wenzelm
parents: 30161
diff changeset
 20136
val showId = Unsynchronized.ref false;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20137
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20138
local
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20139
  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
 20140
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20141
  fun pp (Metis_Clause {id,thm,...}) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20142
      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
 20143
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20144
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20145
fun toString cl = Metis_Print.toString pp cl;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20146
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20147
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20148
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20149
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20150
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20151
val default : parameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20152
    {ordering = Metis_KnuthBendixOrder.default,
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 20153
     orderLiterals = PositiveLiteralOrder,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20154
     orderTerms = true};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20155
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20156
fun mk info = Metis_Clause info
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20157
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20158
fun dest (Metis_Clause info) = info;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20159
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20160
fun id (Metis_Clause {id = i, ...}) = i;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20161
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20162
fun thm (Metis_Clause {thm = th, ...}) = th;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20163
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20164
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
 20165
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20166
fun new parameters thm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20167
    Metis_Clause {parameters = parameters, id = newId (), thm = thm};
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20168
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20169
fun literals cl = Metis_Thm.clause (thm cl);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20170
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20171
fun isTautology (Metis_Clause {thm,...}) = Metis_Thm.isTautology thm;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20172
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20173
fun isContradiction (Metis_Clause {thm,...}) = Metis_Thm.isContradiction thm;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20174
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20175
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20176
(* The term ordering is used to cut down inferences.                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20177
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20178
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20179
fun strictlyLess ordering x_y =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20180
    case Metis_KnuthBendixOrder.compare ordering x_y of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20181
      SOME LESS => true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20182
    | _ => false;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20183
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20184
fun isLargerTerm ({ordering,orderTerms,...} : parameters) l_r =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20185
    not orderTerms orelse not (strictlyLess ordering l_r);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20186
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20187
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20188
  fun atomToTerms atm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20189
      case total Metis_Atom.destEq atm of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20190
        NONE => [Metis_Term.Fn atm]
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 20191
      | SOME (l,r) => [l,r];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20192
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20193
  fun notStrictlyLess ordering (xs,ys) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20194
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20195
        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
 20196
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20197
        not (List.all less xs)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20198
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20199
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20200
  fun isLargerLiteral ({ordering,orderLiterals,...} : parameters) lits =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20201
      case orderLiterals of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20202
        NoLiteralOrder => K true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20203
      | UnsignedLiteralOrder =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20204
        let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20205
          fun addLit ((_,atm),acc) = atomToTerms atm @ acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20206
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20207
          val tms = Metis_LiteralSet.foldl addLit [] lits
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20208
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20209
          fn (_,atm') => notStrictlyLess ordering (atomToTerms atm', tms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20210
        end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20211
      | PositiveLiteralOrder =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20212
        case Metis_LiteralSet.findl (K true) lits of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20213
          NONE => K true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20214
        | SOME (pol,_) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20215
          let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20216
            fun addLit ((p,atm),acc) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20217
                if p = pol then atomToTerms atm @ acc else acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20218
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20219
            val tms = Metis_LiteralSet.foldl addLit [] lits
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20220
          in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20221
            fn (pol',atm') =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20222
               if pol <> pol' then pol
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20223
               else notStrictlyLess ordering (atomToTerms atm', tms)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20224
          end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20225
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20226
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20227
fun largestLiterals (Metis_Clause {parameters,thm,...}) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20228
    let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20229
      val litSet = Metis_Thm.clause thm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20230
      val isLarger = isLargerLiteral parameters litSet
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20231
      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
 20232
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20233
      Metis_LiteralSet.foldr addLit Metis_LiteralSet.empty litSet
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20234
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20235
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20236
(*MetisTrace6
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20237
val largestLiterals = fn cl =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20238
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20239
      val ppResult = Metis_LiteralSet.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20240
      val () = Metis_Print.trace pp "Metis_Clause.largestLiterals: cl" cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20241
      val result = largestLiterals cl
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20242
      val () = Metis_Print.trace ppResult "Metis_Clause.largestLiterals: result" result
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20243
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20244
      result
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20245
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20246
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20247
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20248
fun largestEquations (cl as Metis_Clause {parameters,...}) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20249
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20250
      fun addEq lit ort (l_r as (l,_)) acc =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20251
          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
 20252
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20253
      fun addLit (lit,acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20254
          case total Metis_Literal.destEq lit of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20255
            NONE => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20256
          | SOME (l,r) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20257
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20258
              val acc = addEq lit Metis_Rewrite.RightToLeft (r,l) acc
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20259
              val acc = addEq lit Metis_Rewrite.LeftToRight (l,r) acc
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20260
            in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20261
              acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20262
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20263
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20264
      Metis_LiteralSet.foldr addLit [] (largestLiterals cl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20265
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20266
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20267
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20268
  fun addLit (lit,acc) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20269
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20270
        fun addTm ((path,tm),acc) = (lit,path,tm) :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20271
      in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20272
        List.foldl addTm acc (Metis_Literal.nonVarTypedSubterms lit)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20273
      end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20274
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20275
  fun largestSubterms cl = Metis_LiteralSet.foldl addLit [] (largestLiterals cl);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20276
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20277
  fun allSubterms cl = Metis_LiteralSet.foldl addLit [] (literals cl);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20278
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20279
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20280
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20281
(* Subsumption.                                                              *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20282
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20283
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20284
fun subsumes (subs : clause Metis_Subsume.subsume) cl =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20285
    Metis_Subsume.isStrictlySubsumed subs (literals cl);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20286
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20287
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20288
(* Simplifying rules: these preserve the clause id.                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20289
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20290
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20291
fun freshVars (Metis_Clause {parameters,id,thm}) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20292
    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
 20293
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20294
fun simplify (Metis_Clause {parameters,id,thm}) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20295
    case Metis_Rule.simplify thm of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20296
      NONE => NONE
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20297
    | 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
 20298
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20299
fun reduce units (Metis_Clause {parameters,id,thm}) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20300
    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
 20301
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20302
local
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20303
  fun simp rewr (parm : parameters) id th =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20304
      let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20305
        val {ordering,...} = parm
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20306
        val cmp = Metis_KnuthBendixOrder.compare ordering
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20307
      in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20308
        Metis_Rewrite.rewriteIdRule rewr cmp id th
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20309
      end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20310
in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20311
  fun rewrite rewr cl =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20312
      let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20313
        val Metis_Clause {parameters = parm, id, thm = th} = cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20314
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20315
(*MetisTrace4
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20316
        val () = Metis_Print.trace Metis_Rewrite.pp "Metis_Clause.rewrite: rewr" rewr
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20317
        val () = Metis_Print.trace Metis_Print.ppInt "Metis_Clause.rewrite: id" id
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20318
        val () = Metis_Print.trace pp "Metis_Clause.rewrite: cl" cl
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20319
*)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20320
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20321
        val th =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20322
            case Metis_Rewrite.peek rewr id of
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20323
              NONE => simp rewr parm id th
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20324
            | SOME ((_,th),_) =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20325
              if Metis_Rewrite.isReduced rewr then th else simp rewr parm id th
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20326
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20327
        val result = Metis_Clause {parameters = parm, id = id, thm = th}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20328
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20329
(*MetisTrace4
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20330
        val () = Metis_Print.trace pp "Metis_Clause.rewrite: result" result
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20331
*)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20332
      in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20333
        result
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20334
      end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20335
(*MetisDebug
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20336
      handle Error err => raise Error ("Metis_Clause.rewrite:\n" ^ err);
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20337
*)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20338
end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20339
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20340
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20341
(* Inference rules: these generate new clause ids.                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20342
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20343
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20344
fun factor (cl as Metis_Clause {parameters,thm,...}) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20345
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20346
      val lits = largestLiterals cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20347
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20348
      fun apply sub = new parameters (Metis_Thm.subst sub thm)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20349
    in
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 20350
      List.map apply (Metis_Rule.factor' lits)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20351
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20352
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20353
(*MetisTrace5
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20354
val factor = fn cl =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20355
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20356
      val () = Metis_Print.trace pp "Metis_Clause.factor: cl" cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20357
      val result = factor cl
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20358
      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
 20359
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20360
      result
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20361
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20362
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20363
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20364
fun resolve (cl1,lit1) (cl2,lit2) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20365
    let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20366
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20367
      val () = Metis_Print.trace pp "Metis_Clause.resolve: cl1" cl1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20368
      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
 20369
      val () = Metis_Print.trace pp "Metis_Clause.resolve: cl2" cl2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20370
      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
 20371
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20372
      val Metis_Clause {parameters, thm = th1, ...} = cl1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20373
      and Metis_Clause {thm = th2, ...} = cl2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20374
      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
 20375
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20376
      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
 20377
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20378
      val lit1 = Metis_Literal.subst sub lit1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20379
      val lit2 = Metis_Literal.negate lit1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20380
      val th1 = Metis_Thm.subst sub th1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20381
      and th2 = Metis_Thm.subst sub th2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20382
      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
 20383
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20384
              (trace "Metis_Clause.resolve: th1 violates ordering\n"; false) orelse
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20385
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20386
              raise Error "resolve: clause1: ordering constraints"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20387
      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
 20388
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20389
              (trace "Metis_Clause.resolve: th2 violates ordering\n"; false) orelse
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20390
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20391
              raise Error "resolve: clause2: ordering constraints"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20392
      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
 20393
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20394
      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
 20395
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20396
      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
 20397
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20398
      val () = Metis_Print.trace pp "Metis_Clause.resolve: cl" cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20399
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20400
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20401
      cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20402
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20403
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20404
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
 20405
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20406
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20407
      val () = Metis_Print.trace pp "Metis_Clause.paramodulate: cl1" cl1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20408
      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
 20409
      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
 20410
      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
 20411
      val () = Metis_Print.trace pp "Metis_Clause.paramodulate: cl2" cl2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20412
      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
 20413
      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
 20414
      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
 20415
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20416
      val Metis_Clause {parameters, thm = th1, ...} = cl1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20417
      and Metis_Clause {thm = th2, ...} = cl2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20418
      val sub = Metis_Subst.unify Metis_Subst.empty tm1 tm2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20419
      val lit1 = Metis_Literal.subst sub lit1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20420
      and lit2 = Metis_Literal.subst sub lit2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20421
      and th1 = Metis_Thm.subst sub th1
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20422
      and th2 = Metis_Thm.subst sub th2
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20423
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20424
      val _ = isLargerLiteral parameters (Metis_Thm.clause th1) lit1 orelse
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20425
              raise Error "Metis_Clause.paramodulate: with clause: ordering"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20426
      val _ = isLargerLiteral parameters (Metis_Thm.clause th2) lit2 orelse
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20427
              raise Error "Metis_Clause.paramodulate: into clause: ordering"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20428
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20429
      val eqn = (Metis_Literal.destEq lit1, th1)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20430
      val eqn as (l_r,_) =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20431
          case ort1 of
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20432
            Metis_Rewrite.LeftToRight => eqn
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20433
          | Metis_Rewrite.RightToLeft => Metis_Rule.symEqn eqn
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20434
(*MetisTrace6
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20435
      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
 20436
*)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20437
      val _ = isLargerTerm parameters l_r orelse
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20438
              raise Error "Metis_Clause.paramodulate: equation: ordering constraints"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20439
      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
 20440
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20441
      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
 20442
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20443
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20444
      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
 20445
    end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20446
(*MetisTrace5
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20447
    handle Error err =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20448
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20449
        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
 20450
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20451
        raise Error err
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20452
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20453
*)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20454
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20455
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20456
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20457
(**** Original file: src/Active.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20458
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20459
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20460
(* THE ACTIVE SET OF CLAUSES                                                 *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20461
(* Copyright (c) 2002 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20462
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20463
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20464
signature Metis_Active =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20465
sig
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20468
(* A type of active clause sets.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20469
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20470
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20471
type simplify =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20472
     {subsume : bool,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20473
      reduce : bool,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20474
      rewrite : bool}
23442
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
type parameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20477
     {clause : Metis_Clause.parameters,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20478
      prefactor : simplify,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20479
      postfactor : simplify}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20480
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20481
type active
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20482
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
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20485
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20486
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20487
val default : parameters
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20488
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20489
val size : active -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20490
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20491
val saturation : active -> Metis_Clause.clause list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20492
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20493
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20494
(* Create a new active clause set and initialize clauses.                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20495
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20496
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20497
val new :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20498
    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
 20499
    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
 20500
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20501
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20502
(* Add a clause into the active set and deduce all consequences.             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20503
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20504
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20505
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
 20506
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20507
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20508
(* Pretty printing.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20509
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20510
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20511
val pp : active Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20512
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20513
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20514
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20515
(**** Original file: src/Active.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20516
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20517
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20518
(* THE ACTIVE SET OF CLAUSES                                                 *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20519
(* Copyright (c) 2002 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20520
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20521
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20522
structure Metis_Active :> Metis_Active =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20523
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20524
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20525
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20526
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20527
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20528
(* Helper functions.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20529
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20530
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20531
(*MetisDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20532
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20533
  fun mkRewrite ordering =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20534
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20535
        fun add (cl,rw) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20536
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20537
              val {id, thm = th, ...} = Metis_Clause.dest cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20538
            in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20539
              case total Metis_Thm.destUnitEq th of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20540
                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
 20541
              | NONE => rw
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20542
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20543
      in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20544
        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
 20545
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20546
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20547
  fun allFactors red =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20548
      let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20549
        fun allClause cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20550
            List.all red (cl :: Metis_Clause.factor cl) orelse
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20551
            let
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20552
              val () = Metis_Print.trace Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20553
                         "Metis_Active.isSaturated.allFactors: cl" cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20554
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20555
              false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20556
            end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20557
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20558
        List.all allClause
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20559
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20560
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20561
  fun allResolutions red =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20562
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20563
        fun allClause2 cl_lit cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20564
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20565
              fun allLiteral2 lit =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20566
                  case total (Metis_Clause.resolve cl_lit) (cl,lit) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20567
                    NONE => true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20568
                  | SOME cl => allFactors red [cl]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20569
            in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20570
              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
 20571
            end orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20572
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20573
              val () = Metis_Print.trace Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20574
                         "Metis_Active.isSaturated.allResolutions: cl2" cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20575
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20576
              false
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20577
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20578
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20579
        fun allClause1 allCls cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20580
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20581
              val cl = Metis_Clause.freshVars cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20582
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20583
              fun allLiteral1 lit = List.all (allClause2 (cl,lit)) allCls
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20584
            in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20585
              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
 20586
            end orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20587
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20588
              val () = Metis_Print.trace Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20589
                         "Metis_Active.isSaturated.allResolutions: cl1" cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20590
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20591
              false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20592
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20593
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20594
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20595
        fn [] => true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20596
         | allCls as cl :: cls =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20597
           allClause1 allCls cl andalso allResolutions red cls
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20598
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20599
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20600
  fun allParamodulations red cls =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20601
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20602
        fun allClause2 cl_lit_ort_tm cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20603
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20604
              fun allLiteral2 lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20605
                  let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20606
                    val para = Metis_Clause.paramodulate cl_lit_ort_tm
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20607
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20608
                    fun allSubterms (path,tm) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20609
                        case total para (cl,lit,path,tm) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20610
                          NONE => true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20611
                        | SOME cl => allFactors red [cl]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20612
                  in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20613
                    List.all allSubterms (Metis_Literal.nonVarTypedSubterms lit)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20614
                  end orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20615
                  let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20616
                    val () = Metis_Print.trace Metis_Literal.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20617
                               "Metis_Active.isSaturated.allParamodulations: lit2" lit
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20618
                  in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20619
                    false
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20620
                  end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20621
            in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20622
              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
 20623
            end orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20624
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20625
              val () = Metis_Print.trace Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20626
                         "Metis_Active.isSaturated.allParamodulations: cl2" cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20627
              val (_,_,ort,_) = cl_lit_ort_tm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20628
              val () = Metis_Print.trace Metis_Rewrite.ppOrient
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20629
                         "Metis_Active.isSaturated.allParamodulations: ort1" ort
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20630
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20631
              false
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20632
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20633
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20634
        fun allClause1 cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20635
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20636
              val cl = Metis_Clause.freshVars cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20637
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20638
              fun allLiteral1 lit =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20639
                  let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20640
                    fun allCl2 x = List.all (allClause2 x) cls
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20641
                  in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20642
                    case total Metis_Literal.destEq lit of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20643
                      NONE => true
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20644
                    | SOME (l,r) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20645
                      allCl2 (cl,lit,Metis_Rewrite.LeftToRight,l) andalso
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20646
                      allCl2 (cl,lit,Metis_Rewrite.RightToLeft,r)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20647
                  end orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20648
                  let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20649
                    val () = Metis_Print.trace Metis_Literal.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20650
                               "Metis_Active.isSaturated.allParamodulations: lit1" lit
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20651
                  in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20652
                    false
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20653
                  end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20654
            in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20655
              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
 20656
            end orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20657
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20658
              val () = Metis_Print.trace Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20659
                         "Metis_Active.isSaturated.allParamodulations: cl1" cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20660
            in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20661
              false
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20662
            end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20663
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20664
        List.all allClause1 cls
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20665
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20666
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20667
  fun redundant {subsume,reduce,rewrite} =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20668
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20669
        fun simp cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20670
            case Metis_Clause.simplify cl of
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20671
              NONE => true  (* tautology case *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20672
            | SOME cl =>
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20673
              Metis_Subsume.isSubsumed subsume (Metis_Clause.literals cl) orelse
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20674
              let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20675
                val cl' = cl
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20676
                val cl' = Metis_Clause.reduce reduce cl'
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20677
                val cl' = Metis_Clause.rewrite rewrite cl'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20678
              in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20679
                not (Metis_Clause.equalThms cl cl') andalso
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20680
                (simp cl' orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20681
                 let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20682
                   val () = Metis_Print.trace Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20683
                              "Metis_Active.isSaturated.redundant: cl'" cl'
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20684
                 in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20685
                   false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20686
                 end)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20687
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20688
      in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20689
        fn cl =>
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20690
           simp cl orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20691
           let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20692
             val () = Metis_Print.trace Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20693
                        "Metis_Active.isSaturated.redundant: cl" cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20694
           in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20695
             false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20696
           end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20697
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20698
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20699
  fun isSaturated ordering subs cls =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20700
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20701
        val rd = Metis_Units.empty
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20702
        val rw = mkRewrite ordering cls
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20703
        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
 20704
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20705
        (allFactors red cls andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20706
         allResolutions red cls andalso
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20707
         allParamodulations red cls) orelse
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20708
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20709
          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
 20710
          val () = Metis_Print.trace (Metis_Print.ppList Metis_Clause.pp)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20711
                     "Metis_Active.isSaturated: clauses" cls
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20712
        in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20713
          false
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20714
        end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20715
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20716
end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20717
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20718
fun checkSaturated ordering subs cls =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20719
    if isSaturated ordering subs cls then ()
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20720
    else raise Bug "Metis_Active.checkSaturated";
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20721
*)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20722
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20723
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20724
(* A type of active clause sets.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20725
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20726
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20727
type simplify = {subsume : bool, reduce : bool, rewrite : bool};
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
type parameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20730
     {clause : Metis_Clause.parameters,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20731
      prefactor : simplify,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20732
      postfactor : simplify};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20733
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20734
datatype active =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20735
    Metis_Active of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20736
      {parameters : parameters,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20737
       clauses : Metis_Clause.clause Metis_IntMap.map,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20738
       units : Metis_Units.units,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20739
       rewrite : Metis_Rewrite.rewrite,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20740
       subsume : Metis_Clause.clause Metis_Subsume.subsume,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20741
       literals : (Metis_Clause.clause * Metis_Literal.literal) Metis_LiteralNet.literalNet,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20742
       equations :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20743
         (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
 20744
         Metis_TermNet.termNet,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20745
       subterms :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20746
         (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
 20747
         Metis_TermNet.termNet,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20748
       allSubterms : (Metis_Clause.clause * Metis_Term.term) Metis_TermNet.termNet};
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20749
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20750
fun getSubsume (Metis_Active {subsume = s, ...}) = s;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20751
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20752
fun setRewrite active rewrite =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20753
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20754
      val Metis_Active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20755
            {parameters,clauses,units,subsume,literals,equations,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20756
             subterms,allSubterms,...} = active
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20757
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20758
      Metis_Active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20759
        {parameters = parameters, clauses = clauses, units = units,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20760
         rewrite = rewrite, subsume = subsume, literals = literals,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20761
         equations = equations, subterms = subterms, allSubterms = allSubterms}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20762
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20763
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20764
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20765
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20766
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20767
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20768
val maxSimplify : simplify = {subsume = true, reduce = true, rewrite = true};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20769
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20770
val default : parameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20771
    {clause = Metis_Clause.default,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20772
     prefactor = maxSimplify,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20773
     postfactor = maxSimplify};
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20774
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20775
fun empty parameters =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20776
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20777
      val {clause,...} = parameters
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20778
      val {ordering,...} = clause
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20779
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20780
      Metis_Active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20781
        {parameters = parameters,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20782
         clauses = Metis_IntMap.new (),
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20783
         units = Metis_Units.empty,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20784
         rewrite = Metis_Rewrite.new (Metis_KnuthBendixOrder.compare ordering),
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20785
         subsume = Metis_Subsume.new (),
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20786
         literals = Metis_LiteralNet.new {fifo = false},
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20787
         equations = Metis_TermNet.new {fifo = false},
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20788
         subterms = Metis_TermNet.new {fifo = false},
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20789
         allSubterms = Metis_TermNet.new {fifo = false}}
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20790
    end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20791
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20792
fun size (Metis_Active {clauses,...}) = Metis_IntMap.size clauses;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20793
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20794
fun clauses (Metis_Active {clauses = cls, ...}) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20795
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20796
      fun add (_,cl,acc) = cl :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20797
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20798
      Metis_IntMap.foldr add [] cls
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20799
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20800
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20801
fun saturation active =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20802
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20803
      fun remove (cl,(cls,subs)) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20804
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20805
            val lits = Metis_Clause.literals cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20806
          in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20807
            if Metis_Subsume.isStrictlySubsumed subs lits then (cls,subs)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20808
            else (cl :: cls, Metis_Subsume.insert subs (lits,()))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20809
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20810
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20811
      val cls = clauses active
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20812
      val (cls,_) = List.foldl remove ([], Metis_Subsume.new ()) cls
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20813
      val (cls,subs) = List.foldl remove ([], Metis_Subsume.new ()) cls
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20814
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20815
(*MetisDebug
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20816
      val Metis_Active {parameters,...} = active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20817
      val {clause,...} = parameters
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20818
      val {ordering,...} = clause
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20819
      val () = checkSaturated ordering subs cls
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20820
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20821
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20822
      cls
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20823
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20824
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20825
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20826
(* Pretty printing.                                                          *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20827
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20828
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20829
val pp =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20830
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20831
      fun toStr active = "Metis_Active{" ^ Int.toString (size active) ^ "}"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20832
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20833
      Metis_Print.ppMap toStr Metis_Print.ppString
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20834
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20835
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20836
(*MetisDebug
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20837
local
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20838
  fun ppField f ppA a =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 20839
      Metis_Print.inconsistentBlock 2
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20840
        [Metis_Print.ppString (f ^ " ="),
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 20841
         Metis_Print.break,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20842
         ppA a];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20843
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20844
  val ppClauses =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20845
      ppField "clauses"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20846
        (Metis_Print.ppMap Metis_IntMap.toList
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20847
           (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
 20848
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20849
  val ppRewrite = ppField "rewrite" Metis_Rewrite.pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20850
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20851
  val ppSubterms =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20852
      ppField "subterms"
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20853
        (Metis_TermNet.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20854
           (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
 20855
              (Metis_Print.ppPair
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20856
                 (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
 20857
                 Metis_Term.pp)));
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20858
in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20859
  fun pp (Metis_Active {clauses,rewrite,subterms,...}) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 20860
      Metis_Print.inconsistentBlock 2
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20861
        [Metis_Print.ppString "Metis_Active",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 20862
         Metis_Print.break,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 20863
         Metis_Print.inconsistentBlock 1
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20864
           [Metis_Print.ppString "{",
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20865
            ppClauses clauses,
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20866
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 20867
            Metis_Print.break,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20868
            ppRewrite rewrite,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20869
(*MetisTrace5
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20870
            Metis_Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 20871
            Metis_Print.break,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20872
            ppSubterms subterms,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20873
*)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20874
            Metis_Print.skip],
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 20875
         Metis_Print.ppString "}"];
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20876
end;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20877
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20878
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20879
val toString = Metis_Print.toString pp;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20880
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20881
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20882
(* Simplify clauses.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20883
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20884
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20885
fun simplify simp units rewr subs =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20886
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20887
      val {subsume = s, reduce = r, rewrite = w} = simp
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
      fun rewrite cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20890
          let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20891
            val cl' = Metis_Clause.rewrite rewr cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20892
          in
74358
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20893
            if Metis_Clause.equalThms cl cl' then SOME cl
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20894
            else
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20895
              case Metis_Clause.simplify cl' of
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20896
                NONE => NONE
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20897
              | SOME cl'' =>
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20898
                (*                                                         *)
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20899
                (* Post-rewrite simplification can enable more rewrites:   *)
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20900
                (*                                                         *)
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20901
                (*  ~(X = f(X)) \/ ~(g(Y) = f(X)) \/ ~(c = f(X))           *)
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20902
                (* ---------------------------------------------- rewrite  *)
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20903
                (*  ~(X = f(X)) \/ ~(g(Y) = X) \/ ~(c = X)                 *)
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20904
                (* ---------------------------------------------- simplify *)
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20905
                (*  ~(g(Y) = f(g(Y))) \/ ~(c = g(Y))                       *)
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20906
                (* ---------------------------------------------- rewrite  *)
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20907
                (*  ~(c = f(c)) \/ ~(c = g(Y))                             *)
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20908
                (*                                                         *)
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20909
                (* This was first observed in a bug discovered by Martin   *)
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20910
                (* Desharnais and Jasmin Blanchett                         *)
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20911
                (*                                                         *)
6ab3116a251a updated to Metis 2.4 (release 20200713)
desharna
parents: 72004
diff changeset
 20912
                if Metis_Clause.equalThms cl' cl'' then SOME cl' else rewrite cl''
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20913
          end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20914
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20915
      fn cl =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20916
         case Metis_Clause.simplify cl of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20917
           NONE => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20918
         | SOME cl =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20919
           case (if w then rewrite cl else SOME cl) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20920
             NONE => NONE
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20921
           | SOME cl =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20922
             let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20923
               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
 20924
             in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20925
               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
 20926
             end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20927
    end;
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
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20930
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
 20931
    let
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20932
      val ppClOpt = Metis_Print.ppOption Metis_Clause.pp
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20933
      fun trace pp s = Metis_Print.trace pp ("Metis_Active.simplify: " ^ s)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20934
      val traceCl = trace Metis_Clause.pp
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20935
      val traceClOpt = trace ppClOpt
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 20936
(*MetisTrace4
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20937
      val () = traceCl "cl" cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20938
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20939
      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
 20940
(*MetisTrace4
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20941
      val () = Metis_Print.trace ppClOpt "Metis_Active.simplify: cl'" cl'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20942
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20943
      val () =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20944
          case cl' of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20945
            NONE => ()
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20946
          | SOME cl' =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20947
            case
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20948
              (case simplify simp units rewr subs cl' of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20949
                 NONE => SOME ("away", K ())
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20950
               | SOME cl'' =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20951
                 if Metis_Clause.equalThms cl' cl'' then NONE
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20952
                 else SOME ("further", fn () => traceCl "cl''" cl'')) of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20953
              NONE => ()
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20954
            | SOME (e,f) =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20955
              let
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20956
                val () = Metis_Print.trace Metis_Rewrite.pp "Metis_Active.simplify: rewr" rewr
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20957
                val () = Metis_Print.trace Metis_Units.pp "Metis_Active.simplify: units" units
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20958
                val () = Metis_Print.trace Metis_Subsume.pp "Metis_Active.simplify: subs" subs
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20959
                val () = traceCl "cl" cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20960
                val () = traceCl "cl'" cl'
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20961
                val () = traceClOpt "simplify cl'" (Metis_Clause.simplify cl')
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20962
                val () = traceCl "rewrite cl'" (Metis_Clause.rewrite rewr cl')
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 20963
                val () = traceCl "reduce cl'" (Metis_Clause.reduce units cl')
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20964
                val () = f ()
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20965
              in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20966
                raise
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20967
                  Bug
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20968
                    ("Metis_Active.simplify: clause should have been simplified "^e)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20969
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20970
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20971
      cl'
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20972
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20973
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20974
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20975
fun simplifyActive simp active =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20976
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20977
      val Metis_Active {units,rewrite,subsume,...} = active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20978
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20979
      simplify simp units rewrite subsume
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20980
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20981
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20982
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20983
(* Add a clause into the active set.                                         *)
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
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20986
fun addUnit units cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20987
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20988
      val th = Metis_Clause.thm cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20989
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20990
      case total Metis_Thm.destUnit th of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20991
        SOME lit => Metis_Units.add units (lit,th)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20992
      | NONE => units
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20993
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20994
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20995
fun addRewrite rewrite cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 20996
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20997
      val th = Metis_Clause.thm cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20998
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 20999
      case total Metis_Thm.destUnitEq th of
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21000
        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
 21001
      | NONE => rewrite
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21002
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21003
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21004
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
 21005
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21006
fun addLiterals literals cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21007
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21008
      fun add (lit as (_,atm), literals) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21009
          if Metis_Atom.isEq atm then literals
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21010
          else Metis_LiteralNet.insert literals (lit,(cl,lit))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21011
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21012
      Metis_LiteralSet.foldl add literals (Metis_Clause.largestLiterals cl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21013
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21014
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21015
fun addEquations equations cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21016
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21017
      fun add ((lit,ort,tm),equations) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21018
          Metis_TermNet.insert equations (tm,(cl,lit,ort,tm))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21019
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21020
      List.foldl add equations (Metis_Clause.largestEquations cl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21021
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21022
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21023
fun addSubterms subterms cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21024
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21025
      fun add ((lit,path,tm),subterms) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21026
          Metis_TermNet.insert subterms (tm,(cl,lit,path,tm))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21027
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21028
      List.foldl add subterms (Metis_Clause.largestSubterms cl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21029
    end;
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
fun addAllSubterms allSubterms cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21032
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21033
      fun add ((_,_,tm),allSubterms) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21034
          Metis_TermNet.insert allSubterms (tm,(cl,tm))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21035
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21036
      List.foldl add allSubterms (Metis_Clause.allSubterms cl)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21037
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21038
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21039
fun addClause active cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21040
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21041
      val Metis_Active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21042
            {parameters,clauses,units,rewrite,subsume,literals,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21043
             equations,subterms,allSubterms} = active
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21044
      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
 21045
      and subsume = addSubsume subsume cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21046
      and literals = addLiterals literals cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21047
      and equations = addEquations equations cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21048
      and subterms = addSubterms subterms cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21049
      and allSubterms = addAllSubterms allSubterms cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21050
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21051
      Metis_Active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21052
        {parameters = parameters, clauses = clauses, units = units,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21053
         rewrite = rewrite, subsume = subsume, literals = literals,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21054
         equations = equations, subterms = subterms,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21055
         allSubterms = allSubterms}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21056
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21057
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21058
fun addFactorClause active cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21059
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21060
      val Metis_Active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21061
            {parameters,clauses,units,rewrite,subsume,literals,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21062
             equations,subterms,allSubterms} = active
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21063
      val units = addUnit units cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21064
      and rewrite = addRewrite rewrite cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21065
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21066
      Metis_Active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21067
        {parameters = parameters, clauses = clauses, units = units,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21068
         rewrite = rewrite, subsume = subsume, literals = literals,
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21069
         equations = equations, subterms = subterms, allSubterms = allSubterms}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21070
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21071
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21072
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21073
(* Derive (unfactored) consequences of a clause.                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21074
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21075
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 21076
fun deduceResolution literals cl (lit as (_,atm), acc) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21077
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21078
      fun resolve (cl_lit,acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21079
          case total (Metis_Clause.resolve cl_lit) (cl,lit) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21080
            SOME cl' => cl' :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21081
          | NONE => acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21082
(*MetisTrace4
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21083
      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
 21084
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21085
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21086
      if Metis_Atom.isEq atm then acc
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21087
      else
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21088
        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
 21089
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21090
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21091
fun deduceParamodulationWith subterms cl ((lit,ort,tm),acc) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21092
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21093
      fun para (cl_lit_path_tm,acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21094
          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
 21095
            SOME cl' => cl' :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21096
          | NONE => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21097
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21098
      List.foldl para acc (Metis_TermNet.unify subterms tm)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21099
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21100
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21101
fun deduceParamodulationInto equations cl ((lit,path,tm),acc) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21102
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21103
      fun para (cl_lit_ort_tm,acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21104
          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
 21105
            SOME cl' => cl' :: acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21106
          | NONE => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21107
    in
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21108
      List.foldl para acc (Metis_TermNet.unify equations tm)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21109
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21110
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21111
fun deduce active cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21112
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21113
      val Metis_Active {parameters,literals,equations,subterms,...} = active
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21114
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21115
      val lits = Metis_Clause.largestLiterals cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21116
      val eqns = Metis_Clause.largestEquations cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21117
      val subtms =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21118
          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
 21119
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21120
      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
 21121
      val () = Metis_Print.trace
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21122
                 (Metis_Print.ppList
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21123
                    (Metis_Print.ppMap (fn (lit,ort,_) => (lit,ort))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21124
                      (Metis_Print.ppPair Metis_Literal.pp Metis_Rewrite.ppOrient)))
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21125
                 "Metis_Active.deduce: eqns" eqns
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21126
      val () = Metis_Print.trace
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21127
                 (Metis_Print.ppList
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21128
                    (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
 21129
                 "Metis_Active.deduce: subtms" subtms
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21130
*)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21131
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21132
      val acc = []
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21133
      val acc = Metis_LiteralSet.foldl (deduceResolution literals cl) acc lits
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21134
      val acc = List.foldl (deduceParamodulationWith subterms cl) acc eqns
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21135
      val acc = List.foldl (deduceParamodulationInto equations cl) acc subtms
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 21136
      val acc = List.rev acc
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21137
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21138
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21139
      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
 21140
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21141
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21142
      acc
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21143
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21144
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21145
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21146
(* Extract clauses from the active set that can be simplified.               *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21147
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21148
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21149
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21150
  fun clause_rewritables active =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21151
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21152
        val Metis_Active {clauses,rewrite,...} = active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21153
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21154
        fun rewr (id,cl,ids) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21155
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21156
              val cl' = Metis_Clause.rewrite rewrite cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21157
            in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21158
              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
 21159
            end
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21160
      in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21161
        Metis_IntMap.foldr rewr Metis_IntSet.empty clauses
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21162
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21163
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21164
  fun orderedRedexResidues (((l,r),_),ort) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21165
      case ort of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21166
        NONE => []
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21167
      | SOME Metis_Rewrite.LeftToRight => [(l,r,true)]
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21168
      | SOME Metis_Rewrite.RightToLeft => [(r,l,true)];
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21169
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21170
  fun unorderedRedexResidues (((l,r),_),ort) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21171
      case ort of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21172
        NONE => [(l,r,false),(r,l,false)]
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21173
      | SOME _ => [];
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21174
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21175
  fun rewrite_rewritables active rewr_ids =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21176
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21177
        val Metis_Active {parameters,rewrite,clauses,allSubterms,...} = active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21178
        val {clause = {ordering,...}, ...} = parameters
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21179
        val order = Metis_KnuthBendixOrder.compare ordering
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21180
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21181
        fun addRewr (id,acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21182
            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
 21183
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21184
        fun addReduce ((l,r,ord),acc) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21185
            let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21186
              fun isValidRewr tm =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21187
                  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
 21188
                    NONE => false
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21189
                  | SOME sub =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21190
                    ord orelse
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21191
                    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21192
                      val tm' = Metis_Subst.subst (Metis_Subst.normalize sub) r
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21193
                    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21194
                      order (tm,tm') = SOME GREATER
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21195
                    end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21196
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21197
              fun addRed ((cl,tm),acc) =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21198
                  let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21199
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21200
                    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
 21201
                    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
 21202
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21203
                    val id = Metis_Clause.id cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21204
                  in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21205
                    if Metis_IntSet.member id acc then acc
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21206
                    else if not (isValidRewr tm) then acc
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21207
                    else Metis_IntSet.add acc id
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21208
                  end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21209
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21210
(*MetisTrace5
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21211
              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
 21212
              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
 21213
              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
 21214
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21215
            in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21216
              List.foldl addRed acc (Metis_TermNet.matched allSubterms l)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21217
            end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21218
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21219
        fun addEquation redexResidues (id,acc) =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21220
            case Metis_Rewrite.peek rewrite id of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21221
              NONE => acc
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21222
            | SOME eqn_ort => List.foldl addReduce acc (redexResidues eqn_ort)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21223
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21224
        val addOrdered = addEquation orderedRedexResidues
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21225
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21226
        val addUnordered = addEquation unorderedRedexResidues
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21227
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21228
        val ids = Metis_IntSet.empty
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21229
        val ids = List.foldl addRewr ids rewr_ids
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21230
        val ids = List.foldl addOrdered ids rewr_ids
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21231
        val ids = List.foldl addUnordered ids rewr_ids
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21232
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21233
        ids
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21234
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21235
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21236
  fun choose_clause_rewritables active ids = size active <= length ids
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21237
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21238
  fun rewritables active ids =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21239
      if choose_clause_rewritables active ids then clause_rewritables active
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21240
      else rewrite_rewritables active ids;
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
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21243
  val rewritables = fn active => fn ids =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21244
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21245
        val clause_ids = clause_rewritables active
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21246
        val rewrite_ids = rewrite_rewritables active ids
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21247
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21248
        val () =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21249
            if Metis_IntSet.equal rewrite_ids clause_ids then ()
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21250
            else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21251
              let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21252
                val ppIdl = Metis_Print.ppList Metis_Print.ppInt
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21253
                val ppIds = Metis_Print.ppMap Metis_IntSet.toList ppIdl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21254
                val () = Metis_Print.trace pp "Metis_Active.rewritables: active" active
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21255
                val () = Metis_Print.trace ppIdl "Metis_Active.rewritables: ids" ids
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21256
                val () = Metis_Print.trace ppIds
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21257
                           "Metis_Active.rewritables: clause_ids" clause_ids
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21258
                val () = Metis_Print.trace ppIds
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21259
                           "Metis_Active.rewritables: rewrite_ids" rewrite_ids
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21260
              in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21261
                raise Bug "Metis_Active.rewritables: ~(rewrite_ids SUBSET clause_ids)"
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21262
              end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21263
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21264
        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
 21265
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21266
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21267
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21268
  fun delete active ids =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21269
      if Metis_IntSet.null ids then active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21270
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21271
        let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21272
          fun idPred id = not (Metis_IntSet.member id ids)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21273
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21274
          fun clausePred cl = idPred (Metis_Clause.id cl)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21275
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21276
          val Metis_Active
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21277
                {parameters,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21278
                 clauses,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21279
                 units,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21280
                 rewrite,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21281
                 subsume,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21282
                 literals,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21283
                 equations,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21284
                 subterms,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21285
                 allSubterms} = active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21286
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21287
          val clauses = Metis_IntMap.filter (idPred o fst) clauses
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21288
          and subsume = Metis_Subsume.filter clausePred subsume
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21289
          and literals = Metis_LiteralNet.filter (clausePred o #1) literals
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21290
          and equations = Metis_TermNet.filter (clausePred o #1) equations
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21291
          and subterms = Metis_TermNet.filter (clausePred o #1) subterms
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21292
          and allSubterms = Metis_TermNet.filter (clausePred o fst) allSubterms
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21293
        in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21294
          Metis_Active
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21295
            {parameters = parameters,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21296
             clauses = clauses,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21297
             units = units,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21298
             rewrite = rewrite,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21299
             subsume = subsume,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21300
             literals = literals,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21301
             equations = equations,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21302
             subterms = subterms,
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21303
             allSubterms = allSubterms}
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21304
        end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21305
in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21306
  fun extract_rewritables (active as Metis_Active {clauses,rewrite,...}) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21307
      if Metis_Rewrite.isReduced rewrite then (active,[])
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21308
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21309
        let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21310
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21311
          val () = trace "Metis_Active.extract_rewritables: inter-reducing\n"
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21312
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21313
          val (rewrite,ids) = Metis_Rewrite.reduce' rewrite
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21314
          val active = setRewrite active rewrite
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21315
          val ids = rewritables active ids
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21316
          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
 21317
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21318
          val ppCls = Metis_Print.ppList Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21319
          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
 21320
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21321
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21322
          (delete active ids, cls)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21323
        end
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21324
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21325
        handle Error err =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21326
          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
 21327
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21328
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21329
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
(* Factor clauses.                                                           *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21332
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21333
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21334
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21335
  fun prefactor_simplify active subsume =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21336
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21337
        val Metis_Active {parameters,units,rewrite,...} = active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21338
        val {prefactor,...} = parameters
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21339
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21340
        simplify prefactor units rewrite subsume
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21341
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21342
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21343
  fun postfactor_simplify active subsume =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21344
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21345
        val Metis_Active {parameters,units,rewrite,...} = active
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21346
        val {postfactor,...} = parameters
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21347
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21348
        simplify postfactor units rewrite subsume
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21349
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21350
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21351
  val sort_utilitywise =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21352
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21353
        fun utility cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21354
            case Metis_LiteralSet.size (Metis_Clause.literals cl) of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21355
              0 => ~1
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21356
            | 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
 21357
            | n => n
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21358
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21359
        sortMap utility Int.compare
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21360
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21361
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21362
  fun post_factor (cl, active_subsume_acc as (active,subsume,acc)) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21363
      case postfactor_simplify active subsume cl of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21364
        NONE => active_subsume_acc
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21365
      | SOME cl' =>
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21366
        if Metis_Clause.equalThms cl' cl then
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21367
          let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21368
            val active = addFactorClause active cl
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21369
            and subsume = addSubsume subsume cl
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21370
            and acc = cl :: acc
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21371
          in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21372
            (active,subsume,acc)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21373
          end
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21374
        else
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21375
          (* If the clause was changed in the post-factor simplification *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21376
          (* step, then it may have altered the set of largest literals *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21377
          (* in the clause. The safest thing to do is to factor again. *)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21378
          factor1 cl' active_subsume_acc
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21379
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21380
  and factor1 cl active_subsume_acc =
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21381
      let
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21382
        val cls = sort_utilitywise (cl :: Metis_Clause.factor cl)
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21383
      in
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21384
        List.foldl post_factor active_subsume_acc cls
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21385
      end;
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21386
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21387
  fun pre_factor (cl, active_subsume_acc as (active,subsume,_)) =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21388
      case prefactor_simplify active subsume cl of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21389
        NONE => active_subsume_acc
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21390
      | SOME cl => factor1 cl active_subsume_acc;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21391
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 43269
diff changeset
 21392
  fun factor' active acc [] = (active, List.rev acc)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21393
    | factor' active acc cls =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21394
      let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21395
        val cls = sort_utilitywise cls
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21396
        val subsume = getSubsume active
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21397
        val (active,_,acc) = List.foldl pre_factor (active,subsume,acc) cls
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21398
        val (active,cls) = extract_rewritables active
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21399
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21400
        factor' active acc cls
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21401
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21402
in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21403
  fun factor active cls = factor' active [] cls;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21404
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21405
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21406
(*MetisTrace4
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21407
val factor = fn active => fn cls =>
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21408
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21409
      val ppCls = Metis_Print.ppList Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21410
      val () = Metis_Print.trace ppCls "Metis_Active.factor: cls" cls
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21411
      val (active,cls') = factor active cls
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21412
      val () = Metis_Print.trace ppCls "Metis_Active.factor: cls'" cls'
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21413
    in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21414
      (active,cls')
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21415
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21416
*)
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
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21419
(* Create a new active clause set and initialize clauses.                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21420
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21421
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21422
fun new parameters {axioms,conjecture} =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21423
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21424
      val {clause,...} = parameters
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21425
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21426
      fun mk_clause th =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21427
          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
 21428
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21429
      val active = empty parameters
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21430
      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
 21431
      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
 21432
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21433
      (active, {axioms = axioms, conjecture = conjecture})
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21434
    end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21435
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21436
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21437
(* Add a clause into the active set and deduce all consequences.             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21438
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21439
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21440
fun add active cl =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21441
    case simplifyActive maxSimplify active cl of
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21442
      NONE => (active,[])
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21443
    | SOME cl' =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21444
      if Metis_Clause.isContradiction cl' then (active,[cl'])
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21445
      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
 21446
      else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21447
        let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21448
(*MetisTrace2
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21449
          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
 21450
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21451
          val active = addClause active cl
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21452
          val cl = Metis_Clause.freshVars cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21453
          val cls = deduce active cl
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21454
          val (active,cls) = factor active cls
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21455
(*MetisTrace2
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21456
          val ppCls = Metis_Print.ppList Metis_Clause.pp
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21457
          val () = Metis_Print.trace ppCls "Metis_Active.add: cls" cls
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21458
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21459
        in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21460
          (active,cls)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21461
        end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21462
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21463
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21464
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21465
(**** Original file: src/Waiting.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21466
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21467
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21468
(* THE WAITING SET OF CLAUSES                                                *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21469
(* Copyright (c) 2002 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21470
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21471
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21472
signature Metis_Waiting =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21473
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21474
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21475
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21476
(* 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
 21477
(* 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
 21478
(* 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
 21479
(*                                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21480
(* 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
 21481
(*                                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21482
(*   d * s^symbolsWeight * v^variablesWeight * l^literalsWeight * m          *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21483
(*                                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21484
(* where                                                                     *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21485
(*                                                                           *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21486
(*   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
 21487
(*   s = the number of symbols in the clause                                 *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21488
(*   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
 21489
(*   l = the number of literals in the clause                                *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21490
(*   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
 21491
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21492
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21493
type weight = real
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21494
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21495
type modelParameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21496
     {model : Metis_Model.parameters,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21497
      initialPerturbations : int,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21498
      maxChecks : int option,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21499
      perturbations : int,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21500
      weight : weight}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21501
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21502
type parameters =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21503
     {symbolsWeight : weight,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21504
      variablesWeight : weight,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21505
      literalsWeight : weight,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21506
      models : modelParameters list}
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21507
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21508
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21509
(* A type of waiting sets of clauses.                                        *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21510
(* ------------------------------------------------------------------------- *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21511
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21512
type waiting
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21513
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21514
type distance
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21515
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21516
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21517
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21518
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21519
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21520
val default : parameters
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21521
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21522
val new :
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21523
    parameters ->
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21524
    {axioms : Metis_Clause.clause list,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21525
     conjecture : Metis_Clause.clause list} -> waiting
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21526
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21527
val size : waiting -> int
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21528
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21529
val pp : waiting Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21530
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21531
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21532
(* Adding new clauses.                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21533
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21534
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21535
val add : waiting -> distance * Metis_Clause.clause list -> waiting
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21536
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21537
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21538
(* Removing the lightest clause.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21539
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21540
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21541
val remove : waiting -> ((distance * Metis_Clause.clause) * waiting) option
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21542
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21543
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21544
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21545
(**** Original file: src/Waiting.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21546
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21547
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21548
(* THE WAITING SET OF CLAUSES                                                *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21549
(* Copyright (c) 2002 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21550
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21551
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21552
structure Metis_Waiting :> Metis_Waiting =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21553
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21554
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21555
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21556
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21557
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21558
(* A type of waiting sets of clauses.                                        *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21559
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21560
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21561
type weight = real;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21562
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21563
type modelParameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21564
     {model : Metis_Model.parameters,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21565
      initialPerturbations : int,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21566
      maxChecks : int option,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21567
      perturbations : int,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21568
      weight : weight}
25430
372d6749f00e patching in the latest changes from Hurd
paulson
parents: 24324
diff changeset
 21569
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21570
type parameters =
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21571
     {symbolsWeight : weight,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21572
      variablesWeight : weight,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21573
      literalsWeight : weight,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21574
      models : modelParameters list};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21575
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21576
type distance = real;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21577
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21578
datatype waiting =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21579
    Metis_Waiting of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21580
      {parameters : parameters,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21581
       clauses : (weight * (distance * Metis_Clause.clause)) Metis_Heap.heap,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21582
       models : Metis_Model.model list};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21583
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21584
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21585
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21586
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21587
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21588
val defaultModels : modelParameters list =
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21589
    [{model = Metis_Model.default,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21590
      initialPerturbations = 100,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21591
      maxChecks = SOME 20,
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21592
      perturbations = 0,
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21593
      weight = 1.0}];
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21594
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21595
val default : parameters =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21596
     {symbolsWeight = 1.0,
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21597
      literalsWeight = 1.0,
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21598
      variablesWeight = 1.0,
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21599
      models = defaultModels};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21600
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21601
fun size (Metis_Waiting {clauses,...}) = Metis_Heap.size clauses;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21602
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21603
val pp =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21604
    Metis_Print.ppMap
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21605
      (fn w => "Metis_Waiting{" ^ Int.toString (size w) ^ "}")
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21606
      Metis_Print.ppString;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21607
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21608
(*MetisDebug
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21609
val pp =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21610
    Metis_Print.ppMap
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21611
      (fn Metis_Waiting {clauses,...} =>
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21612
          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
 21613
      (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
 21614
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21615
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21616
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21617
(* Perturbing the models.                                                    *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21618
(* ------------------------------------------------------------------------- *)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21619
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21620
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
 21621
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21622
fun mkModelClause cl =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21623
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21624
      val lits = Metis_Clause.literals cl
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21625
      val fvs = Metis_LiteralSet.freeVars lits
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21626
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21627
      (fvs,lits)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21628
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21629
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21630
val mkModelClauses = List.map mkModelClause;
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21631
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21632
fun perturbModel M cls =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21633
    if List.null cls then K ()
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21634
    else
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21635
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21636
        val N = {size = Metis_Model.size M}
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21637
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21638
        fun perturbClause (fv,cl) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21639
            let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21640
              val V = Metis_Model.randomValuation N fv
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21641
            in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21642
              if Metis_Model.interpretClause M V cl then ()
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21643
              else Metis_Model.perturbClause M V cl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21644
            end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21645
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21646
        fun perturbClauses () = app perturbClause cls
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21647
      in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21648
        fn n => funpow n perturbClauses ()
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21649
      end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21650
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21651
fun initialModel axioms conjecture parm =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21652
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21653
      val {model,initialPerturbations,...} : modelParameters = parm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21654
      val m = Metis_Model.new model
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21655
      val () = perturbModel m conjecture initialPerturbations
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21656
      val () = perturbModel m axioms initialPerturbations
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21657
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21658
      m
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21659
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21660
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21661
fun checkModels parms models (fv,cl) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21662
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21663
      fun check ((parm,model),z) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21664
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21665
            val {maxChecks,weight,...} : modelParameters = parm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21666
            val n = {maxChecks = maxChecks}
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21667
            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
 21668
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21669
            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
 21670
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21671
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21672
      List.foldl check 1.0 (zip parms models)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21673
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21674
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21675
fun perturbModels parms models cls =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21676
    let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21677
      fun perturb (parm,model) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21678
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21679
            val {perturbations,...} : modelParameters = parm
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21680
          in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21681
            perturbModel model cls perturbations
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21682
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21683
    in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21684
      app perturb (zip parms models)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21685
    end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21686
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21687
(* ------------------------------------------------------------------------- *)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21688
(* Metis_Clause weights.                                                           *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21689
(* ------------------------------------------------------------------------- *)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21690
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21691
local
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21692
  fun clauseSymbols cl = Real.fromInt (Metis_LiteralSet.typedSymbols cl);
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21693
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21694
  fun clauseVariables cl =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21695
      Real.fromInt (Metis_NameSet.size (Metis_LiteralSet.freeVars cl) + 1);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21696
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21697
  fun clauseLiterals cl = Real.fromInt (Metis_LiteralSet.size cl);
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21698
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21699
  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
 21700
in
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21701
  fun clauseWeight (parm : parameters) mods dist mcl cl =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21702
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21703
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21704
        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
 21705
*)
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21706
        val {symbolsWeight,variablesWeight,literalsWeight,models,...} = parm
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21707
        val lits = Metis_Clause.literals cl
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21708
        val symbolsW = Math.pow (clauseSymbols lits, symbolsWeight)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21709
        val variablesW = Math.pow (clauseVariables lits, variablesWeight)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21710
        val literalsW = Math.pow (clauseLiterals lits, literalsWeight)
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21711
        val modelsW = checkModels models mods mcl
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21712
(*MetisTrace4
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21713
        val () = trace ("Metis_Waiting.clauseWeight: dist = " ^
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21714
                        Real.toString dist ^ "\n")
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21715
        val () = trace ("Metis_Waiting.clauseWeight: symbolsW = " ^
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21716
                        Real.toString symbolsW ^ "\n")
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21717
        val () = trace ("Metis_Waiting.clauseWeight: variablesW = " ^
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21718
                        Real.toString variablesW ^ "\n")
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21719
        val () = trace ("Metis_Waiting.clauseWeight: literalsW = " ^
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21720
                        Real.toString literalsW ^ "\n")
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21721
        val () = trace ("Metis_Waiting.clauseWeight: modelsW = " ^
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21722
                        Real.toString modelsW ^ "\n")
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21723
*)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21724
        val weight = dist * symbolsW * variablesW * literalsW * modelsW
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21725
        val weight = weight + clausePriority cl
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21726
(*MetisTrace3
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21727
        val () = trace ("Metis_Waiting.clauseWeight: weight = " ^
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21728
                        Real.toString weight ^ "\n")
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21729
*)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21730
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21731
        weight
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21732
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21733
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21734
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21735
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21736
(* Adding new clauses.                                                       *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21737
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21738
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21739
fun add' waiting dist mcls cls =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21740
    let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21741
      val Metis_Waiting {parameters,clauses,models} = waiting
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21742
      val {models = modelParameters, ...} = parameters
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21743
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21744
(*MetisDebug
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21745
      val _ = not (List.null cls) orelse
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21746
              raise Bug "Metis_Waiting.add': null"
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21747
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21748
      val _ = length mcls = length cls orelse
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21749
              raise Bug "Metis_Waiting.add': different lengths"
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21750
*)
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21751
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21752
      val dist = dist + Math.ln (Real.fromInt (length cls))
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21753
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21754
      fun addCl ((mcl,cl),acc) =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21755
          let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21756
            val weight = clauseWeight parameters models dist mcl cl
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21757
          in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21758
            Metis_Heap.add acc (weight,(dist,cl))
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21759
          end
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21760
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21761
      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
 21762
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21763
      val () = perturbModels modelParameters models mcls
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21764
    in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21765
      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
 21766
    end;
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21767
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21768
fun add waiting (dist,cls) =
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21769
    if List.null cls then waiting
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21770
    else
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21771
      let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21772
(*MetisTrace3
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21773
        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
 21774
        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
 21775
*)
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21776
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21777
        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
 21778
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21779
(*MetisTrace3
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21780
        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
 21781
*)
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21782
      in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21783
        waiting
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21784
      end;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21785
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21786
local
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21787
  fun cmp ((w1,_),(w2,_)) = Real.compare (w1,w2);
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21788
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21789
  fun empty parameters axioms conjecture =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21790
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21791
        val {models = modelParameters, ...} = parameters
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21792
        val clauses = Metis_Heap.new cmp
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21793
        and models = List.map (initialModel axioms conjecture) modelParameters
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21794
      in
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21795
        Metis_Waiting {parameters = parameters, clauses = clauses, models = models}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21796
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21797
in
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21798
  fun new parameters {axioms,conjecture} =
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21799
      let
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21800
        val mAxioms = mkModelClauses axioms
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21801
        and mConjecture = mkModelClauses conjecture
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21802
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21803
        val waiting = empty parameters mAxioms mConjecture
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21804
      in
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21805
        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
 21806
        else add' waiting 0.0 (mAxioms @ mConjecture) (axioms @ conjecture)
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21807
      end
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21808
(*MetisDebug
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21809
      handle e =>
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21810
        let
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21811
          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
 21812
        in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21813
          raise e
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21814
        end;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21815
*)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21816
end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21817
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21818
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21819
(* Removing the lightest clause.                                             *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21820
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21821
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21822
fun remove (Metis_Waiting {parameters,clauses,models}) =
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21823
    if Metis_Heap.null clauses then NONE
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21824
    else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21825
      let
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21826
        val ((_,dcl),clauses) = Metis_Heap.remove clauses
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21827
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21828
        val waiting =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21829
            Metis_Waiting
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21830
              {parameters = parameters,
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21831
               clauses = clauses,
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21832
               models = models}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21833
      in
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21834
        SOME (dcl,waiting)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21835
      end;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21836
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21837
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21838
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21839
(**** Original file: src/Resolution.sig ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21840
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21841
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21842
(* THE RESOLUTION PROOF PROCEDURE                                            *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21843
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21844
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21845
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21846
signature Metis_Resolution =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21847
sig
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21848
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21849
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21850
(* A type of resolution proof procedures.                                    *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21851
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21852
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21853
type parameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21854
     {active : Metis_Active.parameters,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21855
      waiting : Metis_Waiting.parameters}
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21856
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21857
type resolution
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21858
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21859
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21860
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21861
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21862
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21863
val default : parameters
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21864
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21865
val new :
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21866
    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
 21867
    resolution
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21868
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21869
val active : resolution -> Metis_Active.active
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21870
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21871
val waiting : resolution -> Metis_Waiting.waiting
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21872
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21873
val pp : resolution Metis_Print.pp
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21874
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21875
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21876
(* The main proof loop.                                                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21877
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21878
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21879
datatype decision =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21880
    Contradiction of Metis_Thm.thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21881
  | Satisfiable of Metis_Thm.thm list
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21882
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21883
datatype state =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21884
    Decided of decision
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21885
  | Undecided of resolution
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21886
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21887
val iterate : resolution -> state
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21888
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21889
val loop : resolution -> decision
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21890
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21891
end
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21892
39449
fbc1ab44b5f1 regenerated "metis.ML"
blanchet
parents: 39433
diff changeset
 21893
(**** Original file: src/Resolution.sml ****)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21894
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21895
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21896
(* THE RESOLUTION PROOF PROCEDURE                                            *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 59179
diff changeset
 21897
(* Copyright (c) 2001 Joe Leslie-Hurd, distributed under the BSD License     *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21898
(* ========================================================================= *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21899
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21900
structure Metis_Resolution :> Metis_Resolution =
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21901
struct
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21902
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21903
open Metis_Useful;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21904
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21905
(* ------------------------------------------------------------------------- *)
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21906
(* A type of resolution proof procedures.                                    *)
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21907
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21908
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21909
type parameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21910
     {active : Metis_Active.parameters,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21911
      waiting : Metis_Waiting.parameters};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21912
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21913
datatype resolution =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21914
    Metis_Resolution of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21915
      {parameters : parameters,
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21916
       active : Metis_Active.active,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21917
       waiting : Metis_Waiting.waiting};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21918
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21919
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21920
(* Basic operations.                                                         *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21921
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21922
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21923
val default : parameters =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21924
    {active = Metis_Active.default,
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21925
     waiting = Metis_Waiting.default};
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21926
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21927
fun new parameters ths =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21928
    let
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21929
      val {active = activeParm, waiting = waitingParm} = parameters
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21930
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21931
      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
 21932
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21933
      val waiting = Metis_Waiting.new waitingParm cls
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21934
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21935
      Metis_Resolution {parameters = parameters, active = active, waiting = waiting}
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21936
    end
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21937
(*MetisDebug
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21938
    handle e =>
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21939
      let
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21940
        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
 21941
      in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21942
        raise e
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21943
      end;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21944
*)
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21945
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21946
fun active (Metis_Resolution {active = a, ...}) = a;
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21947
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21948
fun waiting (Metis_Resolution {waiting = w, ...}) = w;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21949
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21950
val pp =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21951
    Metis_Print.ppMap
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21952
      (fn Metis_Resolution {active,waiting,...} =>
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21953
          "Metis_Resolution(" ^ Int.toString (Metis_Active.size active) ^
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21954
          "<-" ^ Int.toString (Metis_Waiting.size waiting) ^ ")")
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21955
      Metis_Print.ppString;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21956
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21957
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21958
(* The main proof loop.                                                      *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21959
(* ------------------------------------------------------------------------- *)
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21960
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21961
datatype decision =
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21962
    Contradiction of Metis_Thm.thm
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21963
  | Satisfiable of Metis_Thm.thm list;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21964
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21965
datatype state =
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21966
    Decided of decision
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21967
  | Undecided of resolution;
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21968
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21969
fun iterate res =
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21970
    let
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21971
      val Metis_Resolution {parameters,active,waiting} = res
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21972
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21973
(*MetisTrace2
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21974
      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
 21975
      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
 21976
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21977
    in
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21978
      case Metis_Waiting.remove waiting of
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21979
        NONE =>
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21980
        let
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21981
          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
 21982
        in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21983
          Decided sat
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21984
        end
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21985
      | SOME ((d,cl),waiting) =>
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21986
        if Metis_Clause.isContradiction cl then
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21987
          Decided (Contradiction (Metis_Clause.thm cl))
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21988
        else
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 21989
          let
39351
1e118007e41a regenerated "metis.ML" and reintroduced Larry's old hacks manually;
blanchet
parents: 33514
diff changeset
 21990
(*MetisTrace1
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21991
            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
 21992
*)
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21993
            val (active,cls) = Metis_Active.add active cl
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21994
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 21995
            val waiting = Metis_Waiting.add waiting (d,cls)
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21996
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21997
            val res =
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21998
                Metis_Resolution
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 21999
                  {parameters = parameters,
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 22000
                   active = active,
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 22001
                   waiting = waiting}
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 22002
          in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 22003
            Undecided res
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 22004
          end
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 22005
    end;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 22006
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 22007
fun loop res =
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 22008
    case iterate res of
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 22009
      Decided dec => dec
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
 22010
    | Undecided res => loop res;
23442
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 22011
028e39e5e8f3 The Metis prover (slightly modified version from Larry);
wenzelm
parents:
diff changeset
 22012
end
39417
0be01cad5df4 regenerate "metis.ML", this time without manual hacks
blanchet
parents: 39385
diff changeset
 22013
;