src/Tools/Metis/src/Rewrite.sml
author desharna
Thu, 09 Jul 2020 11:39:16 +0200
changeset 72004 913162a47d9f
parent 45778 df6e210fb44c
child 74358 6ab3116a251a
permissions -rw-r--r--
Update Metis to 2.4
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
(* ORDERED REWRITING FOR FIRST ORDER TERMS                                   *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
     3
(* Copyright (c) 2003 Joe Leslie-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 Rewrite :> Rewrite =
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
(* Orientations of equations.                                                *)
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 orient = LeftToRight | RightToLeft;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    16
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    17
fun toStringOrient ort =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    18
    case ort of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    19
      LeftToRight => "-->"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    20
    | RightToLeft => "<--";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    21
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    22
val ppOrient = Print.ppMap toStringOrient Print.ppString;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    23
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    24
fun toStringOrientOption orto =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    25
    case orto of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    26
      SOME ort => toStringOrient ort
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    27
    | NONE => "<->";
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    28
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    29
val ppOrientOption = Print.ppMap toStringOrientOption Print.ppString;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    30
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    31
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    32
(* A type of rewrite systems.                                                *)
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 reductionOrder = Term.term * Term.term -> order option;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    36
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    37
type equationId = int;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    38
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    39
type equation = Rule.equation;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    40
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    41
datatype rewrite =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    42
    Rewrite of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    43
      {order : reductionOrder,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    44
       known : (equation * orient option) IntMap.map,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    45
       redexes : (equationId * orient) TermNet.termNet,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    46
       subterms : (equationId * bool * Term.path) TermNet.termNet,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    47
       waiting : IntSet.set};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    48
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    49
fun updateWaiting rw waiting =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    50
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    51
      val Rewrite {order, known, redexes, subterms, waiting = _} = rw
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    52
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    53
      Rewrite
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    54
        {order = order, known = known, redexes = redexes,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    55
         subterms = subterms, waiting = waiting}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    56
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    57
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    58
fun deleteWaiting (rw as Rewrite {waiting,...}) id =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    59
    updateWaiting rw (IntSet.delete waiting id);
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
(* Basic operations                                                          *)
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
fun new order =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    66
    Rewrite
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    67
      {order = order,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    68
       known = IntMap.new (),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    69
       redexes = TermNet.new {fifo = false},
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    70
       subterms = TermNet.new {fifo = false},
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    71
       waiting = IntSet.empty};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    72
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    73
fun peek (Rewrite {known,...}) id = IntMap.peek known id;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    74
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    75
fun size (Rewrite {known,...}) = IntMap.size known;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    76
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    77
fun equations (Rewrite {known,...}) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    78
    IntMap.foldr (fn (_,(eqn,_),eqns) => eqn :: eqns) [] known;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    79
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    80
val pp = Print.ppMap equations (Print.ppList Rule.ppEquation);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    81
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    82
(*MetisTrace1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    83
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    84
  fun ppEq ((x_y,_),ort) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    85
      Print.ppOp2 (" " ^ toStringOrientOption ort) Term.pp Term.pp x_y;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    86
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    87
  fun ppField f ppA a =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 42102
diff changeset
    88
      Print.inconsistentBlock 2
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
    89
        [Print.ppString (f ^ " ="),
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 42102
diff changeset
    90
         Print.break,
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    91
         ppA a];
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 ppKnown =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    94
      ppField "known"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    95
        (Print.ppMap IntMap.toList
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    96
           (Print.ppList (Print.ppPair Print.ppInt ppEq)));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    97
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    98
  val ppRedexes =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    99
      ppField "redexes"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   100
        (TermNet.pp (Print.ppPair Print.ppInt ppOrient));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   101
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   102
  val ppSubterms =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   103
      ppField "subterms"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   104
        (TermNet.pp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   105
           (Print.ppMap
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   106
              (fn (i,l,p) => (i, (if l then 0 else 1) :: p))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   107
              (Print.ppPair Print.ppInt Term.ppPath)));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   108
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   109
  val ppWaiting =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   110
      ppField "waiting"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   111
        (Print.ppMap (IntSet.toList) (Print.ppList Print.ppInt));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   112
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   113
  fun pp (Rewrite {known,redexes,subterms,waiting,...}) =
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 42102
diff changeset
   114
      Print.inconsistentBlock 2
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   115
        [Print.ppString "Rewrite",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 42102
diff changeset
   116
         Print.break,
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 42102
diff changeset
   117
         Print.inconsistentBlock 1
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   118
           [Print.ppString "{",
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   119
            ppKnown known,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   120
(*MetisTrace5
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   121
            Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 42102
diff changeset
   122
            Print.break,
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   123
            ppRedexes redexes,
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   124
            Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 42102
diff changeset
   125
            Print.break,
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   126
            ppSubterms subterms,
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   127
            Print.ppString ",",
45778
df6e210fb44c updated Metis to 20110926 version
blanchet
parents: 42102
diff changeset
   128
            Print.break,
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   129
            ppWaiting waiting,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   130
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   131
            Print.skip],
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   132
         Print.ppString "}"]
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   133
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   134
*)
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 toString = Print.toString pp;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   137
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   138
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   139
(* Debug functions.                                                          *)
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
fun termReducible order known id =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   143
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   144
      fun eqnRed ((l,r),_) tm =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   145
          case total (Subst.match Subst.empty l) tm of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   146
            NONE => false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   147
          | SOME sub =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   148
            order (tm, Subst.subst (Subst.normalize sub) r) = SOME GREATER
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   149
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   150
      fun knownRed tm (eqnId,(eqn,ort)) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   151
          eqnId <> id andalso
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   152
          ((ort <> SOME RightToLeft andalso eqnRed eqn tm) orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   153
           (ort <> SOME LeftToRight andalso eqnRed (Rule.symEqn eqn) tm))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   154
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   155
      fun termRed tm = IntMap.exists (knownRed tm) known orelse subtermRed tm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   156
      and subtermRed (Term.Var _) = false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   157
        | subtermRed (Term.Fn (_,tms)) = List.exists termRed tms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   158
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   159
      termRed
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   160
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   161
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   162
fun literalReducible order known id lit =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   163
    List.exists (termReducible order known id) (Literal.arguments lit);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   164
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   165
fun literalsReducible order known id lits =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   166
    LiteralSet.exists (literalReducible order known id) lits;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   167
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   168
fun thmReducible order known id th =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   169
    literalsReducible order known id (Thm.clause th);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   170
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   171
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   172
(* Add equations into the system.                                            *)
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
fun orderToOrient (SOME EQUAL) = raise Error "Rewrite.orient: reflexive"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   176
  | orderToOrient (SOME GREATER) = SOME LeftToRight
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   177
  | orderToOrient (SOME LESS) = SOME RightToLeft
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   178
  | orderToOrient NONE = NONE;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   179
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   180
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   181
  fun ins redexes redex id ort = TermNet.insert redexes (redex,(id,ort));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   182
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   183
  fun addRedexes id (((l,r),_),ort) redexes =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   184
      case ort of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   185
        SOME LeftToRight => ins redexes l id LeftToRight
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   186
      | SOME RightToLeft => ins redexes r id RightToLeft
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   187
      | NONE => ins (ins redexes l id LeftToRight) r id RightToLeft;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   188
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   189
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   190
fun add (rw as Rewrite {known,...}) (id,eqn) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   191
    if IntMap.inDomain id known then rw
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   192
    else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   193
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   194
        val Rewrite {order,redexes,subterms,waiting, ...} = rw
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   195
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   196
        val ort = orderToOrient (order (fst eqn))
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   197
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   198
        val known = IntMap.insert known (id,(eqn,ort))
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   199
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   200
        val redexes = addRedexes id (eqn,ort) redexes
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   201
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   202
        val waiting = IntSet.add waiting id
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   203
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   204
        val rw =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   205
            Rewrite
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   206
              {order = order, known = known, redexes = redexes,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   207
               subterms = subterms, waiting = waiting}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   208
(*MetisTrace5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   209
        val () = Print.trace pp "Rewrite.add: result" rw
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   210
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   211
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   212
        rw
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   213
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   214
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   215
local
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   216
  fun uncurriedAdd (eqn,rw) = add rw eqn;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   217
in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   218
  fun addList rw = List.foldl uncurriedAdd rw;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   219
end;
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   220
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   221
(* ------------------------------------------------------------------------- *)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   222
(* Rewriting (the supplied order must be a refinement of the rewrite order). *)
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   223
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   224
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   225
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   226
  fun reorder ((i,_),(j,_)) = Int.compare (j,i);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   227
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   228
  fun matchingRedexes redexes tm = sort reorder (TermNet.match redexes tm);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   229
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   230
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   231
fun wellOriented NONE _ = true
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   232
  | wellOriented (SOME LeftToRight) LeftToRight = true
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   233
  | wellOriented (SOME RightToLeft) RightToLeft = true
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   234
  | wellOriented _ _ = false;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   235
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   236
fun redexResidue LeftToRight ((l_r,_) : equation) = l_r
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   237
  | redexResidue RightToLeft ((l,r),_) = (r,l);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   238
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   239
fun orientedEquation LeftToRight eqn = eqn
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   240
  | orientedEquation RightToLeft eqn = Rule.symEqn eqn;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   241
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   242
fun rewrIdConv' order known redexes id tm =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   243
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   244
      fun rewr (id',lr) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   245
          let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   246
            val _ = id <> id' orelse raise Error "same theorem"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   247
            val (eqn,ort) = IntMap.get known id'
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   248
            val _ = wellOriented ort lr orelse raise Error "orientation"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   249
            val (l,r) = redexResidue lr eqn
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   250
            val sub = Subst.normalize (Subst.match Subst.empty l tm)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   251
            val tm' = Subst.subst sub r
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   252
            val _ = Option.isSome ort orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   253
                    order (tm,tm') = SOME GREATER orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   254
                    raise Error "order"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   255
            val (_,th) = orientedEquation lr eqn
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   256
          in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   257
            (tm', Thm.subst sub th)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   258
          end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   259
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   260
      case first (total rewr) (matchingRedexes redexes tm) of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   261
        NONE => raise Error "Rewrite.rewrIdConv: no matching rewrites"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   262
      | SOME res => res
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   263
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   264
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   265
fun rewriteIdConv' order known redexes id =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   266
    if IntMap.null known then Rule.allConv
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   267
    else Rule.repeatTopDownConv (rewrIdConv' order known redexes id);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   268
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   269
fun mkNeqConv order lit =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   270
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   271
      val (l,r) = Literal.destNeq lit
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   272
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   273
      case order (l,r) of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   274
        NONE => raise Error "incomparable"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   275
      | SOME LESS =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   276
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   277
          val th = Rule.symmetryRule l r
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   278
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   279
          fn tm =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   280
             if Term.equal tm r then (l,th) else raise Error "mkNeqConv: RL"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   281
        end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   282
      | SOME EQUAL => raise Error "irreflexive"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   283
      | SOME GREATER =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   284
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   285
          val th = Thm.assume lit
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   286
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   287
          fn tm =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   288
             if Term.equal tm l then (r,th) else raise Error "mkNeqConv: LR"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   289
        end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   290
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   291
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   292
datatype neqConvs = NeqConvs of Rule.conv list;
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   293
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   294
val neqConvsEmpty = NeqConvs [];
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   295
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   296
fun neqConvsNull (NeqConvs l) = List.null l;
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   297
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   298
fun neqConvsAdd order (neq as NeqConvs l) lit =
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   299
    case total (mkNeqConv order) lit of
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   300
      NONE => neq
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   301
    | SOME conv => NeqConvs (conv :: l);
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   302
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   303
fun mkNeqConvs order =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   304
    let
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   305
      fun add (lit,neq) = neqConvsAdd order neq lit
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   306
    in
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   307
      LiteralSet.foldl add neqConvsEmpty
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   308
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   309
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   310
fun buildNeqConvs order lits =
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   311
    let
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   312
      fun add (lit,(neq,neqs)) = (neqConvsAdd order neq lit, (lit,neq) :: neqs)
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   313
    in
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   314
      snd (LiteralSet.foldl add (neqConvsEmpty,[]) lits)
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   315
    end;
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   316
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   317
fun neqConvsToConv (NeqConvs l) = Rule.firstConv l;
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   318
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   319
fun neqConvsUnion (NeqConvs l1) (NeqConvs l2) =
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   320
    NeqConvs (List.revAppend (l1,l2));
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   321
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   322
fun neqConvsRewrIdLiterule order known redexes id neq =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   323
    if IntMap.null known andalso neqConvsNull neq then Rule.allLiterule
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   324
    else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   325
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   326
        val neq_conv = neqConvsToConv neq
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   327
        val rewr_conv = rewrIdConv' order known redexes id
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   328
        val conv = Rule.orelseConv neq_conv rewr_conv
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   329
        val conv = Rule.repeatTopDownConv conv
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   330
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   331
        Rule.allArgumentsLiterule conv
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   332
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   333
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   334
fun rewriteIdEqn' order known redexes id (eqn as (l_r,th)) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   335
    let
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   336
      val neq = mkNeqConvs order (Thm.clause th)
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   337
      val literule = neqConvsRewrIdLiterule order known redexes id neq
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   338
      val (strongEqn,lit) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   339
          case Rule.equationLiteral eqn of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   340
            NONE => (true, Literal.mkEq l_r)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   341
          | SOME lit => (false,lit)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   342
      val (lit',litTh) = literule lit
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   343
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   344
      if Literal.equal lit lit' then eqn
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   345
      else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   346
        (Literal.destEq lit',
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   347
         if strongEqn then th
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   348
         else if not (Thm.negateMember lit litTh) then litTh
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   349
         else Thm.resolve lit th litTh)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   350
    end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   351
(*MetisDebug
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   352
    handle Error err => raise Error ("Rewrite.rewriteIdEqn':\n" ^ err);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   353
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   354
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   355
fun rewriteIdLiteralsRule' order known redexes id lits th =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   356
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   357
      val mk_literule = neqConvsRewrIdLiterule order known redexes id
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   358
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   359
      fun rewr_neq_lit ((lit,rneq),(changed,lneq,lits,th)) =
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   360
          let
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   361
            val neq = neqConvsUnion lneq rneq
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   362
            val (lit',litTh) = mk_literule neq lit
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   363
            val lneq = neqConvsAdd order lneq lit'
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   364
            val lits = LiteralSet.add lits lit'
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   365
          in
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   366
            if Literal.equal lit lit' then (changed,lneq,lits,th)
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   367
            else (true, lneq, lits, Thm.resolve lit th litTh)
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   368
          end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   369
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   370
      fun rewr_neq_lits lits th =
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   371
          let
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   372
            val neqs = buildNeqConvs order lits
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   373
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   374
            val neq = neqConvsEmpty
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   375
            val lits = LiteralSet.empty
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   376
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   377
            val (changed,neq,lits,th) =
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   378
                List.foldl rewr_neq_lit (false,neq,lits,th) neqs
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   379
          in
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   380
            if changed then rewr_neq_lits lits th else (neq,th)
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   381
          end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   382
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   383
      val (neq,lits) = LiteralSet.partition Literal.isNeq lits
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   384
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   385
      val (neq,th) = rewr_neq_lits neq th
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   386
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   387
      val rewr_literule = mk_literule neq
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   388
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   389
      fun rewr_lit (lit,th) =
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   390
          if not (Thm.member lit th) then th
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   391
          else Rule.literalRule rewr_literule lit th
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   392
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   393
      LiteralSet.foldl rewr_lit th lits
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   394
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   395
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   396
fun rewriteIdRule' order known redexes id th =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   397
    rewriteIdLiteralsRule' order known redexes id (Thm.clause th) th;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   398
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   399
(*MetisDebug
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   400
val rewriteIdRule' = fn order => fn known => fn redexes => fn id => fn th =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   401
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   402
(*MetisTrace6
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   403
      val () = Print.trace Thm.pp "Rewrite.rewriteIdRule': th" th
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   404
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   405
      val result = rewriteIdRule' order known redexes id th
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   406
(*MetisTrace6
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   407
      val () = Print.trace Thm.pp "Rewrite.rewriteIdRule': result" result
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   408
*)
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   409
      val () = if not (thmReducible order known id result) then ()
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   410
               else raise Bug "Rewrite.rewriteIdRule': should be normalized"
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   411
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   412
      result
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   413
    end
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   414
    handle Error err => raise Error ("Rewrite.rewriteIdRule':\n" ^ err);
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   415
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   416
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   417
fun rewrIdConv (Rewrite {known,redexes,...}) order =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   418
    rewrIdConv' order known redexes;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   419
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   420
fun rewrConv rewrite order = rewrIdConv rewrite order ~1;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   421
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   422
fun rewriteIdConv (Rewrite {known,redexes,...}) order =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   423
    rewriteIdConv' order known redexes;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   424
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   425
fun rewriteConv rewrite order = rewriteIdConv rewrite order ~1;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   426
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   427
fun rewriteIdLiteralsRule (Rewrite {known,redexes,...}) order =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   428
    rewriteIdLiteralsRule' order known redexes;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   429
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   430
fun rewriteLiteralsRule rewrite order =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   431
    rewriteIdLiteralsRule rewrite order ~1;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   432
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   433
fun rewriteIdRule (Rewrite {known,redexes,...}) order =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   434
    rewriteIdRule' order known redexes;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   435
72004
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   436
(*MetisDebug
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   437
val rewriteIdRule = fn rewr => fn order => fn id => fn th =>
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   438
    let
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   439
      val result = rewriteIdRule rewr order id th
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   440
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   441
      val th' = rewriteIdRule rewr order id result
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   442
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   443
      val () = if Thm.equal th' result then ()
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   444
               else
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   445
                 let
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   446
                   fun trace p s = Print.trace p ("Rewrite.rewriteIdRule: "^s)
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   447
                   val () = trace pp "rewr" rewr
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   448
                   val () = trace Thm.pp "th" th
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   449
                   val () = trace Thm.pp "result" result
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   450
                   val () = trace Thm.pp "th'" th'
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   451
                in
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   452
                  raise Bug "Rewrite.rewriteIdRule: should be idempotent"
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   453
                end
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   454
    in
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   455
      result
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   456
    end
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   457
    handle Error err => raise Error ("Rewrite.rewriteIdRule:\n" ^ err);
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   458
*)
913162a47d9f Update Metis to 2.4
desharna
parents: 45778
diff changeset
   459
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   460
fun rewriteRule rewrite order = rewriteIdRule rewrite order ~1;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   461
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   462
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   463
(* Inter-reduce the equations in the system.                                 *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   464
(* ------------------------------------------------------------------------- *)
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 addSubterms id (((l,r),_) : equation) subterms =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   467
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   468
      fun addSubterm b ((path,tm),net) = TermNet.insert net (tm,(id,b,path))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   469
39443
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39353
diff changeset
   470
      val subterms = List.foldl (addSubterm true) subterms (Term.subterms l)
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39353
diff changeset
   471
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39353
diff changeset
   472
      val subterms = List.foldl (addSubterm false) subterms (Term.subterms r)
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   473
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   474
      subterms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   475
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   476
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   477
fun sameRedexes NONE _ _ = false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   478
  | sameRedexes (SOME LeftToRight) (l0,_) (l,_) = Term.equal l0 l
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   479
  | sameRedexes (SOME RightToLeft) (_,r0) (_,r) = Term.equal r0 r;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   480
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   481
fun redexResidues NONE (l,r) = [(l,r,false),(r,l,false)]
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   482
  | redexResidues (SOME LeftToRight) (l,r) = [(l,r,true)]
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   483
  | redexResidues (SOME RightToLeft) (l,r) = [(r,l,true)];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   484
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   485
fun findReducibles order known subterms id =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   486
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   487
      fun checkValidRewr (l,r,ord) id' left path =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   488
          let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   489
            val (((x,y),_),_) = IntMap.get known id'
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   490
            val tm = Term.subterm (if left then x else y) path
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   491
            val sub = Subst.match Subst.empty l tm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   492
          in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   493
            if ord then ()
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   494
            else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   495
              let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   496
                val tm' = Subst.subst (Subst.normalize sub) r
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   497
              in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   498
                if order (tm,tm') = SOME GREATER then ()
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   499
                else raise Error "order"
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
          end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   502
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   503
      fun addRed lr ((id',left,path),todo) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   504
          if id <> id' andalso not (IntSet.member id' todo) andalso
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   505
             can (checkValidRewr lr id' left) path
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   506
          then IntSet.add todo id'
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   507
          else todo
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   508
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   509
      fun findRed (lr as (l,_,_), todo) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   510
          List.foldl (addRed lr) todo (TermNet.matched subterms l)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   511
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   512
      List.foldl findRed
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   513
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   514
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   515
fun reduce1 new id (eqn0,ort0) (rpl,spl,todo,rw,changed) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   516
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   517
      val (eq0,_) = eqn0
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   518
      val Rewrite {order,known,redexes,subterms,waiting} = rw
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   519
      val eqn as (eq,_) = rewriteIdEqn' order known redexes id eqn0
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   520
      val identical =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   521
          let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   522
            val (l0,r0) = eq0
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   523
            and (l,r) = eq
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   524
          in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   525
            Term.equal l l0 andalso Term.equal r r0
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   526
          end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   527
      val same_redexes = identical orelse sameRedexes ort0 eq0 eq
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   528
      val rpl = if same_redexes then rpl else IntSet.add rpl id
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   529
      val spl = if new orelse identical then spl else IntSet.add spl id
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   530
      val changed =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   531
          if not new andalso identical then changed else IntSet.add changed id
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   532
      val ort =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   533
          if same_redexes then SOME ort0 else total orderToOrient (order eq)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   534
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   535
      case ort of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   536
        NONE =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   537
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   538
          val known = IntMap.delete known id
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   539
          val rw =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   540
              Rewrite
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   541
                {order = order, known = known, redexes = redexes,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   542
                 subterms = subterms, waiting = waiting}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   543
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   544
          (rpl,spl,todo,rw,changed)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   545
        end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   546
      | SOME ort =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   547
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   548
          val todo =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   549
              if not new andalso same_redexes then todo
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   550
              else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   551
                findReducibles
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   552
                  order known subterms id todo (redexResidues ort eq)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   553
          val known =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   554
              if identical then known else IntMap.insert known (id,(eqn,ort))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   555
          val redexes =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   556
              if same_redexes then redexes
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   557
              else addRedexes id (eqn,ort) redexes
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   558
          val subterms =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   559
              if new orelse not identical then addSubterms id eqn subterms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   560
              else subterms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   561
          val rw =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   562
              Rewrite
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   563
                {order = order, known = known, redexes = redexes,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   564
                 subterms = subterms, waiting = waiting}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   565
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   566
          (rpl,spl,todo,rw,changed)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   567
        end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   568
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   569
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   570
fun pick known set =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   571
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   572
      fun oriented id =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   573
          case IntMap.peek known id of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   574
            SOME (x as (_, SOME _)) => SOME (id,x)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   575
          | _ => NONE
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   576
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   577
      fun any id =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   578
          case IntMap.peek known id of SOME x => SOME (id,x) | _ => NONE
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
      case IntSet.firstl oriented set of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   581
        x as SOME _ => x
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   582
      | NONE => IntSet.firstl any set
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   583
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   584
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   585
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   586
  fun cleanRedexes known redexes rpl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   587
      if IntSet.null rpl then redexes
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   588
      else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   589
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   590
          fun filt (id,_) = not (IntSet.member id rpl)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   591
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   592
          fun addReds (id,reds) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   593
              case IntMap.peek known id of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   594
                NONE => reds
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   595
              | SOME eqn_ort => addRedexes id eqn_ort reds
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   596
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   597
          val redexes = TermNet.filter filt redexes
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   598
          val redexes = IntSet.foldl addReds redexes rpl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   599
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   600
          redexes
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   601
        end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   602
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   603
  fun cleanSubterms known subterms spl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   604
      if IntSet.null spl then subterms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   605
      else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   606
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   607
          fun filt (id,_,_) = not (IntSet.member id spl)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   608
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   609
          fun addSubtms (id,subtms) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   610
              case IntMap.peek known id of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   611
                NONE => subtms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   612
              | SOME (eqn,_) => addSubterms id eqn subtms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   613
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   614
          val subterms = TermNet.filter filt subterms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   615
          val subterms = IntSet.foldl addSubtms subterms spl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   616
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   617
          subterms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   618
        end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   619
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   620
  fun rebuild rpl spl rw =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   621
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   622
(*MetisTrace5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   623
        val ppPl = Print.ppMap IntSet.toList (Print.ppList Print.ppInt)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   624
        val () = Print.trace ppPl "Rewrite.rebuild: rpl" rpl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   625
        val () = Print.trace ppPl "Rewrite.rebuild: spl" spl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   626
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   627
        val Rewrite {order,known,redexes,subterms,waiting} = rw
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   628
        val redexes = cleanRedexes known redexes rpl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   629
        val subterms = cleanSubterms known subterms spl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   630
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   631
        Rewrite
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   632
          {order = order,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   633
           known = known,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   634
           redexes = redexes,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   635
           subterms = subterms,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   636
           waiting = waiting}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   637
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   638
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   639
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   640
fun reduceAcc (rpl, spl, todo, rw as Rewrite {known,waiting,...}, changed) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   641
    case pick known todo of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   642
      SOME (id,eqn_ort) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   643
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   644
        val todo = IntSet.delete todo id
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   645
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   646
        reduceAcc (reduce1 false id eqn_ort (rpl,spl,todo,rw,changed))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   647
      end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   648
    | NONE =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   649
      case pick known waiting of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   650
        SOME (id,eqn_ort) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   651
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   652
          val rw = deleteWaiting rw id
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   653
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   654
          reduceAcc (reduce1 true id eqn_ort (rpl,spl,todo,rw,changed))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   655
        end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   656
      | NONE => (rebuild rpl spl rw, IntSet.toList changed);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   657
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   658
fun isReduced (Rewrite {waiting,...}) = IntSet.null waiting;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   659
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   660
fun reduce' rw =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   661
    if isReduced rw then (rw,[])
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   662
    else reduceAcc (IntSet.empty,IntSet.empty,IntSet.empty,rw,IntSet.empty);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   663
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   664
(*MetisDebug
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   665
val reduce' = fn rw =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   666
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   667
(*MetisTrace4
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   668
      val () = Print.trace pp "Rewrite.reduce': rw" rw
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   669
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   670
      val Rewrite {known,order,...} = rw
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   671
      val result as (Rewrite {known = known', ...}, _) = reduce' rw
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   672
(*MetisTrace4
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   673
      val ppResult = Print.ppPair pp (Print.ppList Print.ppInt)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   674
      val () = Print.trace ppResult "Rewrite.reduce': result" result
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   675
*)
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   676
      val ths = List.map (fn (id,((_,th),_)) => (id,th)) (IntMap.toList known')
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   677
      val _ =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   678
          not (List.exists (uncurry (thmReducible order known')) ths) orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   679
          raise Bug "Rewrite.reduce': not fully reduced"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   680
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   681
      result
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   682
    end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   683
    handle Error err => raise Bug ("Rewrite.reduce': shouldn't fail\n" ^ err);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   684
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   685
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   686
fun reduce rw = fst (reduce' rw);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   687
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   688
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   689
(* Rewriting as a derived rule.                                              *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   690
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   691
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   692
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   693
  fun addEqn (id_eqn,rw) = add rw id_eqn;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   694
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   695
  fun orderedRewrite order ths =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   696
    let
39443
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39353
diff changeset
   697
      val rw = List.foldl addEqn (new order) (enumerate ths)
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   698
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   699
      rewriteRule rw order
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   700
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   701
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   702
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   703
local
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   704
  val order : reductionOrder = K (SOME GREATER);
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   705
in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   706
  val rewrite = orderedRewrite order;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39672
diff changeset
   707
end;
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   708
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   709
end