src/Tools/Metis/src/Formula.sml
author blanchet
Wed, 27 Aug 2014 08:41:12 +0200
changeset 58043 a90847f03ec8
parent 45778 df6e210fb44c
child 72004 913162a47d9f
permissions -rw-r--r--
avoid 'PolyML.makestring'
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     1
(* ========================================================================= *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     2
(* FIRST ORDER LOGIC FORMULAS                                                *)
39502
cffceed8e7fa fix license
blanchet
parents: 39501
diff changeset
     3
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     4
(* ========================================================================= *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     6
structure Formula :> Formula =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     7
struct
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     8
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     9
open Useful;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    10
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    11
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    12
(* A type of first order logic formulas.                                     *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    13
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    14
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    15
datatype formula =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    16
    True
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    17
  | False
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    18
  | Atom of Atom.atom
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    19
  | Not of formula
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    20
  | And of formula * formula
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    21
  | Or of formula * formula
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    22
  | Imp of formula * formula
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    23
  | Iff of formula * formula
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    24
  | Forall of Term.var * formula
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    25
  | Exists of Term.var * formula;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    26
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    27
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    28
(* Constructors and destructors.                                             *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    29
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    30
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    31
(* Booleans *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    32
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    33
fun mkBoolean true = True
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    34
  | mkBoolean false = False;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    35
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    36
fun destBoolean True = true
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    37
  | destBoolean False = false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    38
  | destBoolean _ = raise Error "destBoolean";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    39
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    40
val isBoolean = can destBoolean;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    41
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    42
fun isTrue fm =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    43
    case fm of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    44
      True => true
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    45
    | _ => false;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    46
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    47
fun isFalse fm =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    48
    case fm of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    49
      False => true
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    50
    | _ => false;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    51
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    52
(* Functions *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    53
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    54
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    55
  fun funcs fs [] = fs
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    56
    | funcs fs (True :: fms) = funcs fs fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    57
    | funcs fs (False :: fms) = funcs fs fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    58
    | funcs fs (Atom atm :: fms) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    59
      funcs (NameAritySet.union (Atom.functions atm) fs) fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    60
    | funcs fs (Not p :: fms) = funcs fs (p :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    61
    | funcs fs (And (p,q) :: fms) = funcs fs (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    62
    | funcs fs (Or (p,q) :: fms) = funcs fs (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    63
    | funcs fs (Imp (p,q) :: fms) = funcs fs (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    64
    | funcs fs (Iff (p,q) :: fms) = funcs fs (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    65
    | funcs fs (Forall (_,p) :: fms) = funcs fs (p :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    66
    | funcs fs (Exists (_,p) :: fms) = funcs fs (p :: fms);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    67
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    68
  fun functions fm = funcs NameAritySet.empty [fm];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    69
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    70
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    71
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    72
  fun funcs fs [] = fs
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    73
    | funcs fs (True :: fms) = funcs fs fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    74
    | funcs fs (False :: fms) = funcs fs fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    75
    | funcs fs (Atom atm :: fms) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    76
      funcs (NameSet.union (Atom.functionNames atm) fs) fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    77
    | funcs fs (Not p :: fms) = funcs fs (p :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    78
    | funcs fs (And (p,q) :: fms) = funcs fs (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    79
    | funcs fs (Or (p,q) :: fms) = funcs fs (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    80
    | funcs fs (Imp (p,q) :: fms) = funcs fs (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    81
    | funcs fs (Iff (p,q) :: fms) = funcs fs (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    82
    | funcs fs (Forall (_,p) :: fms) = funcs fs (p :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    83
    | funcs fs (Exists (_,p) :: fms) = funcs fs (p :: fms);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    84
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    85
  fun functionNames fm = funcs NameSet.empty [fm];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    86
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    87
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    88
(* Relations *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    89
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    90
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    91
  fun rels fs [] = fs
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    92
    | rels fs (True :: fms) = rels fs fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    93
    | rels fs (False :: fms) = rels fs fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    94
    | rels fs (Atom atm :: fms) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    95
      rels (NameAritySet.add fs (Atom.relation atm)) fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    96
    | rels fs (Not p :: fms) = rels fs (p :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    97
    | rels fs (And (p,q) :: fms) = rels fs (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    98
    | rels fs (Or (p,q) :: fms) = rels fs (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    99
    | rels fs (Imp (p,q) :: fms) = rels fs (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   100
    | rels fs (Iff (p,q) :: fms) = rels fs (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   101
    | rels fs (Forall (_,p) :: fms) = rels fs (p :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   102
    | rels fs (Exists (_,p) :: fms) = rels fs (p :: fms);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   103
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   104
  fun relations fm = rels NameAritySet.empty [fm];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   105
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   106
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   107
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   108
  fun rels fs [] = fs
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   109
    | rels fs (True :: fms) = rels fs fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   110
    | rels fs (False :: fms) = rels fs fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   111
    | rels fs (Atom atm :: fms) = rels (NameSet.add fs (Atom.name atm)) fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   112
    | rels fs (Not p :: fms) = rels fs (p :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   113
    | rels fs (And (p,q) :: fms) = rels fs (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   114
    | rels fs (Or (p,q) :: fms) = rels fs (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   115
    | rels fs (Imp (p,q) :: fms) = rels fs (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   116
    | rels fs (Iff (p,q) :: fms) = rels fs (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   117
    | rels fs (Forall (_,p) :: fms) = rels fs (p :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   118
    | rels fs (Exists (_,p) :: fms) = rels fs (p :: fms);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   119
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   120
  fun relationNames fm = rels NameSet.empty [fm];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   121
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   122
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   123
(* Atoms *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   124
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   125
fun destAtom (Atom atm) = atm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   126
  | destAtom _ = raise Error "Formula.destAtom";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   127
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   128
val isAtom = can destAtom;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   129
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   130
(* Negations *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   131
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   132
fun destNeg (Not p) = p
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   133
  | destNeg _ = raise Error "Formula.destNeg";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   134
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   135
val isNeg = can destNeg;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   136
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   137
val stripNeg =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   138
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   139
      fun strip n (Not fm) = strip (n + 1) fm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   140
        | strip n fm = (n,fm)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   141
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   142
      strip 0
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   143
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   144
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   145
(* Conjunctions *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   146
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   147
fun listMkConj fms =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 42102
diff changeset
   148
    case List.rev fms of [] => True | fm :: fms => List.foldl And fm fms;
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   149
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   150
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   151
  fun strip cs (And (p,q)) = strip (p :: cs) q
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 42102
diff changeset
   152
    | strip cs fm = List.rev (fm :: cs);
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   153
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   154
  fun stripConj True = []
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   155
    | stripConj fm = strip [] fm;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   156
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   157
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   158
val flattenConj =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   159
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   160
      fun flat acc [] = acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   161
        | flat acc (And (p,q) :: fms) = flat acc (q :: p :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   162
        | flat acc (True :: fms) = flat acc fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   163
        | flat acc (fm :: fms) = flat (fm :: acc) fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   164
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   165
      fn fm => flat [] [fm]
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   166
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   167
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   168
(* Disjunctions *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   169
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   170
fun listMkDisj fms =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 42102
diff changeset
   171
    case List.rev fms of [] => False | fm :: fms => List.foldl Or fm fms;
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   172
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   173
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   174
  fun strip cs (Or (p,q)) = strip (p :: cs) q
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 42102
diff changeset
   175
    | strip cs fm = List.rev (fm :: cs);
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   176
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   177
  fun stripDisj False = []
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   178
    | stripDisj fm = strip [] fm;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   179
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   180
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   181
val flattenDisj =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   182
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   183
      fun flat acc [] = acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   184
        | flat acc (Or (p,q) :: fms) = flat acc (q :: p :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   185
        | flat acc (False :: fms) = flat acc fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   186
        | flat acc (fm :: fms) = flat (fm :: acc) fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   187
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   188
      fn fm => flat [] [fm]
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   189
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   190
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   191
(* Equivalences *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   192
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   193
fun listMkEquiv fms =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 42102
diff changeset
   194
    case List.rev fms of [] => True | fm :: fms => List.foldl Iff fm fms;
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   195
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   196
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   197
  fun strip cs (Iff (p,q)) = strip (p :: cs) q
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 42102
diff changeset
   198
    | strip cs fm = List.rev (fm :: cs);
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   199
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   200
  fun stripEquiv True = []
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   201
    | stripEquiv fm = strip [] fm;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   202
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   203
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   204
val flattenEquiv =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   205
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   206
      fun flat acc [] = acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   207
        | flat acc (Iff (p,q) :: fms) = flat acc (q :: p :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   208
        | flat acc (True :: fms) = flat acc fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   209
        | flat acc (fm :: fms) = flat (fm :: acc) fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   210
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   211
      fn fm => flat [] [fm]
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   212
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   213
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   214
(* Universal quantifiers *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   215
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   216
fun destForall (Forall v_f) = v_f
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   217
  | destForall _ = raise Error "destForall";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   218
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   219
val isForall = can destForall;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   220
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   221
fun listMkForall ([],body) = body
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   222
  | listMkForall (v :: vs, body) = Forall (v, listMkForall (vs,body));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   223
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   224
fun setMkForall (vs,body) = NameSet.foldr Forall body vs;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   225
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   226
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   227
  fun strip vs (Forall (v,b)) = strip (v :: vs) b
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 42102
diff changeset
   228
    | strip vs tm = (List.rev vs, tm);
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   229
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   230
  val stripForall = strip [];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   231
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   232
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   233
(* Existential quantifiers *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   234
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   235
fun destExists (Exists v_f) = v_f
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   236
  | destExists _ = raise Error "destExists";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   237
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   238
val isExists = can destExists;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   239
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   240
fun listMkExists ([],body) = body
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   241
  | listMkExists (v :: vs, body) = Exists (v, listMkExists (vs,body));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   242
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   243
fun setMkExists (vs,body) = NameSet.foldr Exists body vs;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   244
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   245
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   246
  fun strip vs (Exists (v,b)) = strip (v :: vs) b
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 42102
diff changeset
   247
    | strip vs tm = (List.rev vs, tm);
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   248
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   249
  val stripExists = strip [];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   250
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   251
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   252
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   253
(* The size of a formula in symbols.                                         *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   254
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   255
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   256
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   257
  fun sz n [] = n
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   258
    | sz n (True :: fms) = sz (n + 1) fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   259
    | sz n (False :: fms) = sz (n + 1) fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   260
    | sz n (Atom atm :: fms) = sz (n + Atom.symbols atm) fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   261
    | sz n (Not p :: fms) = sz (n + 1) (p :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   262
    | sz n (And (p,q) :: fms) = sz (n + 1) (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   263
    | sz n (Or (p,q) :: fms) = sz (n + 1) (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   264
    | sz n (Imp (p,q) :: fms) = sz (n + 1) (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   265
    | sz n (Iff (p,q) :: fms) = sz (n + 1) (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   266
    | sz n (Forall (_,p) :: fms) = sz (n + 1) (p :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   267
    | sz n (Exists (_,p) :: fms) = sz (n + 1) (p :: fms);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   268
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   269
  fun symbols fm = sz 0 [fm];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   270
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   271
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   272
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   273
(* A total comparison function for formulas.                                 *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   274
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   275
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   276
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   277
  fun cmp [] = EQUAL
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   278
    | cmp (f1_f2 :: fs) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   279
      if Portable.pointerEqual f1_f2 then cmp fs
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   280
      else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   281
        case f1_f2 of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   282
          (True,True) => cmp fs
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   283
        | (True,_) => LESS
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   284
        | (_,True) => GREATER
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   285
        | (False,False) => cmp fs
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   286
        | (False,_) => LESS
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   287
        | (_,False) => GREATER
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   288
        | (Atom atm1, Atom atm2) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   289
          (case Atom.compare (atm1,atm2) of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   290
             LESS => LESS
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   291
           | EQUAL => cmp fs
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   292
           | GREATER => GREATER)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   293
        | (Atom _, _) => LESS
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   294
        | (_, Atom _) => GREATER
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   295
        | (Not p1, Not p2) => cmp ((p1,p2) :: fs)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   296
        | (Not _, _) => LESS
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   297
        | (_, Not _) => GREATER
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   298
        | (And (p1,q1), And (p2,q2)) => cmp ((p1,p2) :: (q1,q2) :: fs)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   299
        | (And _, _) => LESS
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   300
        | (_, And _) => GREATER
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   301
        | (Or (p1,q1), Or (p2,q2)) => cmp ((p1,p2) :: (q1,q2) :: fs)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   302
        | (Or _, _) => LESS
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   303
        | (_, Or _) => GREATER
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   304
        | (Imp (p1,q1), Imp (p2,q2)) => cmp ((p1,p2) :: (q1,q2) :: fs)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   305
        | (Imp _, _) => LESS
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   306
        | (_, Imp _) => GREATER
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   307
        | (Iff (p1,q1), Iff (p2,q2)) => cmp ((p1,p2) :: (q1,q2) :: fs)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   308
        | (Iff _, _) => LESS
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   309
        | (_, Iff _) => GREATER
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   310
        | (Forall (v1,p1), Forall (v2,p2)) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   311
          (case Name.compare (v1,v2) of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   312
             LESS => LESS
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   313
           | EQUAL => cmp ((p1,p2) :: fs)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   314
           | GREATER => GREATER)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   315
        | (Forall _, Exists _) => LESS
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   316
        | (Exists _, Forall _) => GREATER
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   317
        | (Exists (v1,p1), Exists (v2,p2)) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   318
          (case Name.compare (v1,v2) of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   319
             LESS => LESS
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   320
           | EQUAL => cmp ((p1,p2) :: fs)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   321
           | GREATER => GREATER);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   322
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   323
  fun compare fm1_fm2 = cmp [fm1_fm2];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   324
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   325
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   326
fun equal fm1 fm2 = compare (fm1,fm2) = EQUAL;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   327
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   328
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   329
(* Free variables.                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   330
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   331
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   332
fun freeIn v =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   333
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   334
      fun f [] = false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   335
        | f (True :: fms) = f fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   336
        | f (False :: fms) = f fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   337
        | f (Atom atm :: fms) = Atom.freeIn v atm orelse f fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   338
        | f (Not p :: fms) = f (p :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   339
        | f (And (p,q) :: fms) = f (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   340
        | f (Or (p,q) :: fms) = f (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   341
        | f (Imp (p,q) :: fms) = f (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   342
        | f (Iff (p,q) :: fms) = f (p :: q :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   343
        | f (Forall (w,p) :: fms) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   344
          if Name.equal v w then f fms else f (p :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   345
        | f (Exists (w,p) :: fms) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   346
          if Name.equal v w then f fms else f (p :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   347
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   348
      fn fm => f [fm]
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   349
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   350
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   351
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   352
  fun fv vs [] = vs
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   353
    | fv vs ((_,True) :: fms) = fv vs fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   354
    | fv vs ((_,False) :: fms) = fv vs fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   355
    | fv vs ((bv, Atom atm) :: fms) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   356
      fv (NameSet.union vs (NameSet.difference (Atom.freeVars atm) bv)) fms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   357
    | fv vs ((bv, Not p) :: fms) = fv vs ((bv,p) :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   358
    | fv vs ((bv, And (p,q)) :: fms) = fv vs ((bv,p) :: (bv,q) :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   359
    | fv vs ((bv, Or (p,q)) :: fms) = fv vs ((bv,p) :: (bv,q) :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   360
    | fv vs ((bv, Imp (p,q)) :: fms) = fv vs ((bv,p) :: (bv,q) :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   361
    | fv vs ((bv, Iff (p,q)) :: fms) = fv vs ((bv,p) :: (bv,q) :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   362
    | fv vs ((bv, Forall (v,p)) :: fms) = fv vs ((NameSet.add bv v, p) :: fms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   363
    | fv vs ((bv, Exists (v,p)) :: fms) = fv vs ((NameSet.add bv v, p) :: fms);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   364
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   365
  fun add (fm,vs) = fv vs [(NameSet.empty,fm)];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   366
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   367
  fun freeVars fm = add (fm,NameSet.empty);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   368
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   369
  fun freeVarsList fms = List.foldl add NameSet.empty fms;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   370
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   371
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   372
fun specialize fm = snd (stripForall fm);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   373
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   374
fun generalize fm = listMkForall (NameSet.toList (freeVars fm), fm);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   375
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   376
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   377
(* Substitutions.                                                            *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   378
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   379
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   380
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   381
  fun substCheck sub fm = if Subst.null sub then fm else substFm sub fm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   382
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   383
  and substFm sub fm =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   384
      case fm of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   385
        True => fm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   386
      | False => fm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   387
      | Atom (p,tms) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   388
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   389
          val tms' = Sharing.map (Subst.subst sub) tms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   390
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   391
          if Portable.pointerEqual (tms,tms') then fm else Atom (p,tms')
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   392
        end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   393
      | Not p =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   394
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   395
          val p' = substFm sub p
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   396
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   397
          if Portable.pointerEqual (p,p') then fm else Not p'
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   398
        end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   399
      | And (p,q) => substConn sub fm And p q
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   400
      | Or (p,q) => substConn sub fm Or p q
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   401
      | Imp (p,q) => substConn sub fm Imp p q
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   402
      | Iff (p,q) => substConn sub fm Iff p q
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   403
      | Forall (v,p) => substQuant sub fm Forall v p
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   404
      | Exists (v,p) => substQuant sub fm Exists v p
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   405
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   406
  and substConn sub fm conn p q =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   407
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   408
        val p' = substFm sub p
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   409
        and q' = substFm sub q
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   410
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   411
        if Portable.pointerEqual (p,p') andalso
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   412
           Portable.pointerEqual (q,q')
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   413
        then fm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   414
        else conn (p',q')
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   415
      end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   416
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   417
  and substQuant sub fm quant v p =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   418
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   419
        val v' =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   420
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   421
              fun f (w,s) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   422
                  if Name.equal w v then s
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   423
                  else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   424
                    case Subst.peek sub w of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   425
                      NONE => NameSet.add s w
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   426
                    | SOME tm => NameSet.union s (Term.freeVars tm)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   427
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   428
              val vars = freeVars p
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   429
              val vars = NameSet.foldl f NameSet.empty vars
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   430
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   431
              Term.variantPrime vars v
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   432
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   433
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   434
        val sub =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   435
            if Name.equal v v' then Subst.remove sub (NameSet.singleton v)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   436
            else Subst.insert sub (v, Term.Var v')
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   437
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   438
        val p' = substCheck sub p
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   439
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   440
        if Name.equal v v' andalso Portable.pointerEqual (p,p') then fm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   441
        else quant (v',p')
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   442
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   443
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   444
  val subst = substCheck;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   445
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   446
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   447
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   448
(* The equality relation.                                                    *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   449
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   450
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   451
fun mkEq a_b = Atom (Atom.mkEq a_b);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   452
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   453
fun destEq fm = Atom.destEq (destAtom fm);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   454
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   455
val isEq = can destEq;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   456
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   457
fun mkNeq a_b = Not (mkEq a_b);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   458
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   459
fun destNeq (Not fm) = destEq fm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   460
  | destNeq _ = raise Error "Formula.destNeq";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   461
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   462
val isNeq = can destNeq;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   463
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   464
fun mkRefl tm = Atom (Atom.mkRefl tm);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   465
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   466
fun destRefl fm = Atom.destRefl (destAtom fm);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   467
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   468
val isRefl = can destRefl;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   469
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   470
fun sym fm = Atom (Atom.sym (destAtom fm));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   471
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   472
fun lhs fm = fst (destEq fm);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   473
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   474
fun rhs fm = snd (destEq fm);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   475
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   476
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   477
(* Parsing and pretty-printing.                                              *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   478
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   479
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   480
type quotation = formula Parse.quotation;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   481
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   482
val truthName = Name.fromString "T"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   483
and falsityName = Name.fromString "F"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   484
and conjunctionName = Name.fromString "/\\"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   485
and disjunctionName = Name.fromString "\\/"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   486
and implicationName = Name.fromString "==>"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   487
and equivalenceName = Name.fromString "<=>"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   488
and universalName = Name.fromString "!"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   489
and existentialName = Name.fromString "?";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   490
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   491
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   492
  fun demote True = Term.Fn (truthName,[])
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   493
    | demote False = Term.Fn (falsityName,[])
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   494
    | demote (Atom (p,tms)) = Term.Fn (p,tms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   495
    | demote (Not p) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   496
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   497
        val ref s = Term.negation
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   498
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   499
        Term.Fn (Name.fromString s, [demote p])
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   500
      end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   501
    | demote (And (p,q)) = Term.Fn (conjunctionName, [demote p, demote q])
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   502
    | demote (Or (p,q)) = Term.Fn (disjunctionName, [demote p, demote q])
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   503
    | demote (Imp (p,q)) = Term.Fn (implicationName, [demote p, demote q])
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   504
    | demote (Iff (p,q)) = Term.Fn (equivalenceName, [demote p, demote q])
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   505
    | demote (Forall (v,b)) = Term.Fn (universalName, [Term.Var v, demote b])
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   506
    | demote (Exists (v,b)) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   507
      Term.Fn (existentialName, [Term.Var v, demote b]);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   508
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   509
  fun pp fm = Term.pp (demote fm);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   510
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   511
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   512
val toString = Print.toString pp;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   513
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   514
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   515
  fun isQuant [Term.Var _, _] = true
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   516
    | isQuant _ = false;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   517
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   518
  fun promote (Term.Var v) = Atom (v,[])
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   519
    | promote (Term.Fn (f,tms)) =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   520
      if Name.equal f truthName andalso List.null tms then
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   521
        True
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   522
      else if Name.equal f falsityName andalso List.null tms then
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   523
        False
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   524
      else if Name.toString f = !Term.negation andalso length tms = 1 then
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   525
        Not (promote (hd tms))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   526
      else if Name.equal f conjunctionName andalso length tms = 2 then
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   527
        And (promote (hd tms), promote (List.nth (tms,1)))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   528
      else if Name.equal f disjunctionName andalso length tms = 2 then
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   529
        Or (promote (hd tms), promote (List.nth (tms,1)))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   530
      else if Name.equal f implicationName andalso length tms = 2 then
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   531
        Imp (promote (hd tms), promote (List.nth (tms,1)))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   532
      else if Name.equal f equivalenceName andalso length tms = 2 then
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   533
        Iff (promote (hd tms), promote (List.nth (tms,1)))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   534
      else if Name.equal f universalName andalso isQuant tms then
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   535
        Forall (Term.destVar (hd tms), promote (List.nth (tms,1)))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   536
      else if Name.equal f existentialName andalso isQuant tms then
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   537
        Exists (Term.destVar (hd tms), promote (List.nth (tms,1)))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   538
      else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   539
        Atom (f,tms);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   540
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   541
  fun fromString s = promote (Term.fromString s);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   542
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   543
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   544
val parse = Parse.parseQuotation toString fromString;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   545
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   546
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   547
(* Splitting goals.                                                          *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   548
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   549
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   550
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   551
  fun add_asms asms goal =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 42102
diff changeset
   552
      if List.null asms then goal else Imp (listMkConj (List.rev asms), goal);
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   553
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   554
  fun add_var_asms asms v goal = add_asms asms (Forall (v,goal));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   555
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   556
  fun split asms pol fm =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   557
      case (pol,fm) of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   558
        (* Positive splittables *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   559
        (true,True) => []
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   560
      | (true, Not f) => split asms false f
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   561
      | (true, And (f1,f2)) => split asms true f1 @ split (f1 :: asms) true f2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   562
      | (true, Or (f1,f2)) => split (Not f1 :: asms) true f2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   563
      | (true, Imp (f1,f2)) => split (f1 :: asms) true f2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   564
      | (true, Iff (f1,f2)) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   565
        split (f1 :: asms) true f2 @ split (f2 :: asms) true f1
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   566
      | (true, Forall (v,f)) => List.map (add_var_asms asms v) (split [] true f)
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   567
        (* Negative splittables *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   568
      | (false,False) => []
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   569
      | (false, Not f) => split asms true f
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   570
      | (false, And (f1,f2)) => split (f1 :: asms) false f2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   571
      | (false, Or (f1,f2)) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   572
        split asms false f1 @ split (Not f1 :: asms) false f2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   573
      | (false, Imp (f1,f2)) => split asms true f1 @ split (f1 :: asms) false f2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   574
      | (false, Iff (f1,f2)) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   575
        split (f1 :: asms) false f2 @ split (f2 :: asms) false f1
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   576
      | (false, Exists (v,f)) => List.map (add_var_asms asms v) (split [] false f)
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   577
        (* Unsplittables *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   578
      | _ => [add_asms asms (if pol then fm else Not fm)];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   579
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   580
  fun splitGoal fm = split [] true fm;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   581
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   582
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   583
(*MetisTrace3
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   584
val splitGoal = fn fm =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   585
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   586
      val result = splitGoal fm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   587
      val () = Print.trace pp "Formula.splitGoal: fm" fm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   588
      val () = Print.trace (Print.ppList pp) "Formula.splitGoal: result" result
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   589
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   590
      result
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   591
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   592
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   593
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   594
end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   595
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   596
structure FormulaOrdered =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   597
struct type t = Formula.formula val compare = Formula.compare end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   598
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   599
structure FormulaMap = KeyMap (FormulaOrdered);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   600
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   601
structure FormulaSet = ElementSet (FormulaMap);