src/Tools/Metis/src/Rule.sig
author blanchet
Mon, 13 Sep 2010 21:11:59 +0200
changeset 39349 2d0a4361c3ef
parent 39348 6f9c9899f99f
child 39353 7f11d833d65b
permissions -rw-r--r--
change license, with Joe Hurd's permission
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
(* DERIVED RULES FOR CREATING FIRST ORDER LOGIC THEOREMS                     *)
39349
2d0a4361c3ef change license, with Joe Hurd's permission
blanchet
parents: 39348
diff changeset
     3
(* Copyright (c) 2001-2006 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
signature Rule =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     7
sig
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     8
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     9
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    10
(* An equation consists of two terms (t,u) plus a theorem (stronger than)    *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    11
(* t = u \/ C.                                                               *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    12
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    13
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    14
type equation = (Term.term * Term.term) * Thm.thm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    15
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    16
val ppEquation : equation Print.pp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    17
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    18
val equationToString : equation -> string
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    19
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    20
(* Returns t = u if the equation theorem contains this literal *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    21
val equationLiteral : equation -> Literal.literal option
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    22
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    23
val reflEqn : Term.term -> equation
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    24
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    25
val symEqn : equation -> equation
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    26
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    27
val transEqn : equation -> equation -> equation
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    28
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    29
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    30
(* A conversion takes a term t and either:                                   *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    31
(* 1. Returns a term u together with a theorem (stronger than) t = u \/ C.   *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    32
(* 2. Raises an Error exception.                                             *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    33
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    34
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    35
type conv = Term.term -> Term.term * Thm.thm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    36
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    37
val allConv : conv
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    38
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    39
val noConv : conv
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    40
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    41
val thenConv : conv -> conv -> conv
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    42
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    43
val orelseConv : conv -> conv -> conv
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    44
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    45
val tryConv : conv -> conv
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    46
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    47
val repeatConv : conv -> conv
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    48
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    49
val firstConv : conv list -> conv
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    50
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    51
val everyConv : conv list -> conv
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    52
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    53
val rewrConv : equation -> Term.path -> conv
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    54
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    55
val pathConv : conv -> Term.path -> conv
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    56
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    57
val subtermConv : conv -> int -> conv
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    58
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    59
val subtermsConv : conv -> conv  (* All function arguments *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    60
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    61
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    62
(* Applying a conversion to every subterm, with some traversal strategy.     *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    63
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    64
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    65
val bottomUpConv : conv -> conv
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    66
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    67
val topDownConv : conv -> conv
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    68
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    69
val repeatTopDownConv : conv -> conv  (* useful for rewriting *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    70
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    71
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    72
(* A literule (bad pun) takes a literal L and either:                        *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    73
(* 1. Returns a literal L' with a theorem (stronger than) ~L \/ L' \/ C.     *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    74
(* 2. Raises an Error exception.                                             *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    75
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    76
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    77
type literule = Literal.literal -> Literal.literal * Thm.thm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    78
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    79
val allLiterule : literule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    80
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    81
val noLiterule : literule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    82
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    83
val thenLiterule : literule -> literule -> literule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    84
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    85
val orelseLiterule : literule -> literule -> literule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    86
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    87
val tryLiterule : literule -> literule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    88
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    89
val repeatLiterule : literule -> literule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    90
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    91
val firstLiterule : literule list -> literule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    92
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    93
val everyLiterule : literule list -> literule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    94
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    95
val rewrLiterule : equation -> Term.path -> literule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    96
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    97
val pathLiterule : conv -> Term.path -> literule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    98
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    99
val argumentLiterule : conv -> int -> literule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   100
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   101
val allArgumentsLiterule : conv -> literule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   102
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   103
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   104
(* A rule takes one theorem and either deduces another or raises an Error    *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   105
(* exception.                                                                *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   106
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   107
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   108
type rule = Thm.thm -> Thm.thm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   109
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   110
val allRule : rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   111
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   112
val noRule : rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   113
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   114
val thenRule : rule -> rule -> rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   115
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   116
val orelseRule : rule -> rule -> rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   117
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   118
val tryRule : rule -> rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   119
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   120
val changedRule : rule -> rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   121
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   122
val repeatRule : rule -> rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   123
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   124
val firstRule : rule list -> rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   125
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   126
val everyRule : rule list -> rule
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 literalRule : literule -> Literal.literal -> rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   129
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   130
val rewrRule : equation -> Literal.literal -> Term.path -> rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   131
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   132
val pathRule : conv -> Literal.literal -> Term.path -> rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   133
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   134
val literalsRule : literule -> LiteralSet.set -> rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   135
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   136
val allLiteralsRule : literule -> rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   137
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   138
val convRule : conv -> rule  (* All arguments of all literals *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   139
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   140
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   141
(*                                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   142
(* --------- reflexivity                                                     *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   143
(*   x = x                                                                   *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   144
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   145
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   146
val reflexivityRule : Term.term -> Thm.thm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   147
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   148
val reflexivity : Thm.thm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   149
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   150
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   151
(*                                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   152
(* --------------------- symmetry                                            *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   153
(*   ~(x = y) \/ y = x                                                       *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   154
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   155
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   156
val symmetryRule : Term.term -> Term.term -> Thm.thm
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 symmetry : Thm.thm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   159
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   160
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   161
(*                                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   162
(* --------------------------------- transitivity                            *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   163
(*   ~(x = y) \/ ~(y = z) \/ x = z                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   164
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   165
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   166
val transitivity : Thm.thm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   167
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   168
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   169
(*                                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   170
(* ---------------------------------------------- functionCongruence (f,n)   *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   171
(*   ~(x0 = y0) \/ ... \/ ~(x{n-1} = y{n-1}) \/                              *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   172
(*   f x0 ... x{n-1} = f y0 ... y{n-1}                                       *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   173
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   174
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   175
val functionCongruence : Term.function -> Thm.thm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   176
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   177
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   178
(*                                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   179
(* ---------------------------------------------- relationCongruence (R,n)   *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   180
(*   ~(x0 = y0) \/ ... \/ ~(x{n-1} = y{n-1}) \/                              *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   181
(*   ~R x0 ... x{n-1} \/ R y0 ... y{n-1}                                     *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   182
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   183
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   184
val relationCongruence : Atom.relation -> Thm.thm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   185
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   186
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   187
(*   x = y \/ C                                                              *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   188
(* -------------- symEq (x = y)                                              *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   189
(*   y = x \/ C                                                              *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   190
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   191
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   192
val symEq : Literal.literal -> rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   193
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   194
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   195
(*   ~(x = y) \/ C                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   196
(* ----------------- symNeq ~(x = y)                                         *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   197
(*   ~(y = x) \/ C                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   198
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   199
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   200
val symNeq : Literal.literal -> rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   201
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   202
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   203
(* sym (x = y) = symEq (x = y)  /\  sym ~(x = y) = symNeq ~(x = y)           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   204
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   205
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   206
val sym : Literal.literal -> rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   207
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   208
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   209
(*   ~(x = x) \/ C                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   210
(* ----------------- removeIrrefl                                            *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   211
(*         C                                                                 *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   212
(*                                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   213
(* where all irreflexive equalities.                                         *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   214
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   215
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   216
val removeIrrefl : rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   217
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   218
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   219
(*   x = y \/ y = x \/ C                                                     *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   220
(* ----------------------- removeSym                                         *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   221
(*       x = y \/ C                                                          *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   222
(*                                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   223
(* where all duplicate copies of equalities and disequalities are removed.   *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   224
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   225
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   226
val removeSym : rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   227
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   228
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   229
(*   ~(v = t) \/ C                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   230
(* ----------------- expandAbbrevs                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   231
(*      C[t/v]                                                               *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   232
(*                                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   233
(* where t must not contain any occurrence of the variable v.                *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   234
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   235
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   236
val expandAbbrevs : rule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   237
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   238
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   239
(* simplify = isTautology + expandAbbrevs + removeSym                        *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   240
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   241
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   242
val simplify : Thm.thm -> Thm.thm option
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   243
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   244
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   245
(*    C                                                                      *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   246
(* -------- freshVars                                                        *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   247
(*   C[s]                                                                    *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   248
(*                                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   249
(* where s is a renaming substitution chosen so that all of the variables in *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   250
(* C are replaced by fresh variables.                                        *)
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
val freshVars : rule
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
(*               C                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   257
(* ---------------------------- factor                                       *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   258
(*   C_s_1, C_s_2, ..., C_s_n                                                *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   259
(*                                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   260
(* where each s_i is a substitution that factors C, meaning that the theorem *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   261
(*                                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   262
(*   C_s_i = (removeIrrefl o removeSym o Thm.subst s_i) C                    *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   263
(*                                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   264
(* has fewer literals than C.                                                *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   265
(*                                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   266
(* Also, if s is any substitution that factors C, then one of the s_i will   *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   267
(* result in a theorem C_s_i that strictly subsumes the theorem C_s.         *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   268
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   269
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   270
val factor' : Thm.clause -> Subst.subst list
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   271
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   272
val factor : Thm.thm -> Thm.thm list
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   273
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   274
end