src/Tools/Metis/src/Units.sml
author blanchet
Thu, 16 Sep 2010 07:30:15 +0200
changeset 39444 beabb8443ee4
parent 39443 e330437cd22a
child 39501 aaa7078fff55
permissions -rw-r--r--
MIT license -> BSD License
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
(* A STORE FOR UNIT THEOREMS                                                 *)
39444
beabb8443ee4 MIT license -> BSD License
blanchet
parents: 39443
diff changeset
     3
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     4
(* ========================================================================= *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     6
structure Units :> Units =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     7
struct
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     8
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     9
open Useful;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    10
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    11
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    12
(* A type of unit store.                                                     *)
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
type unitThm = Literal.literal * Thm.thm;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    16
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    17
datatype units = Units of unitThm LiteralNet.literalNet;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    18
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    19
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    20
(* Basic operations.                                                         *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    21
(* ------------------------------------------------------------------------- *)
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 empty = Units (LiteralNet.new {fifo = false});
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    24
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    25
fun size (Units net) = LiteralNet.size net;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    26
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    27
fun toString units = "U{" ^ Int.toString (size units) ^ "}";
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 pp = Print.ppMap toString 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
(* Add units into the store.                                                 *)
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
fun add (units as Units net) (uTh as (lit,th)) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    36
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    37
      val net = LiteralNet.insert net (lit,uTh)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    38
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    39
      case total Literal.sym lit of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    40
        NONE => Units net
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    41
      | SOME (lit' as (pol,_)) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    42
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    43
          val th' = (if pol then Rule.symEq else Rule.symNeq) lit th
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    44
          val net = LiteralNet.insert net (lit',(lit',th'))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    45
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    46
          Units net
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    47
        end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    48
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    49
39443
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39353
diff changeset
    50
val addList = List.foldl (fn (th,u) => add u th);
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    51
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    52
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    53
(* Matching.                                                                 *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    54
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    55
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    56
fun match (Units net) lit =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    57
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    58
      fun check (uTh as (lit',_)) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    59
          case total (Literal.match Subst.empty lit') lit of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    60
            NONE => NONE
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    61
          | SOME sub => SOME (uTh,sub)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    62
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    63
      first check (LiteralNet.match net lit)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    64
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    65
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    66
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    67
(* Reducing by repeated matching and resolution.                             *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    68
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    69
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    70
fun reduce units =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    71
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    72
      fun red1 (lit,news_th) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    73
          case total Literal.destIrrefl lit of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    74
            SOME tm =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    75
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    76
              val (news,th) = news_th
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    77
              val th = Thm.resolve lit th (Thm.refl tm)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    78
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    79
              (news,th)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    80
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    81
          | NONE =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    82
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    83
              val lit' = Literal.negate lit
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    84
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    85
              case match units lit' of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    86
                NONE => news_th
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    87
              | SOME ((_,rth),sub) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    88
                let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    89
                  val (news,th) = news_th
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    90
                  val rth = Thm.subst sub rth
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    91
                  val th = Thm.resolve lit th rth
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    92
                  val new = LiteralSet.delete (Thm.clause rth) lit'
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    93
                  val news = LiteralSet.union new news
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    94
                in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    95
                  (news,th)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    96
                end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    97
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    98
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    99
      fun red (news,th) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   100
          if LiteralSet.null news then th
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   101
          else red (LiteralSet.foldl red1 (LiteralSet.empty,th) news)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   102
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   103
      fn th => Rule.removeSym (red (Thm.clause th, th))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   104
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   105
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   106
end