src/Tools/Metis/src/Clause.sml
author blanchet
Thu, 16 Sep 2010 07:24:04 +0200
changeset 39443 e330437cd22a
parent 39408 65a379f4c8f3
child 39444 beabb8443ee4
permissions -rw-r--r--
copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
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
(* CLAUSE = ID + THEOREM                                                     *)
39443
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39408
diff changeset
     3
(* Copyright (c) 2002 Joe Hurd, distributed under the MIT 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 Clause :> Clause =
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
(* Helper functions.                                                         *)
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
val newId =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    16
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    17
      val r = ref 0
39443
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39408
diff changeset
    18
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39408
diff changeset
    19
      fun new () =
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39408
diff changeset
    20
          let
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39408
diff changeset
    21
            val ref n = r
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39408
diff changeset
    22
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39408
diff changeset
    23
            val () = r := n + 1
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39408
diff changeset
    24
          in
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39408
diff changeset
    25
            n
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39408
diff changeset
    26
          end
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    27
    in
39443
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39408
diff changeset
    28
      fn () => Portable.critical new ()
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    29
    end;
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 clause.                                                         *)
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
datatype literalOrder =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    36
    NoLiteralOrder
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    37
  | UnsignedLiteralOrder
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    38
  | PositiveLiteralOrder;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    39
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    40
type parameters =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    41
     {ordering : KnuthBendixOrder.kbo,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    42
      orderLiterals : literalOrder,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    43
      orderTerms : bool};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    44
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    45
type clauseId = int;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    46
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    47
type clauseInfo = {parameters : parameters, id : clauseId, thm : Thm.thm};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    48
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    49
datatype clause = Clause of clauseInfo;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    50
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    51
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    52
(* Pretty printing.                                                          *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    53
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    54
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    55
val showId = ref false;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    56
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    57
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    58
  val ppIdThm = Print.ppPair Print.ppInt Thm.pp;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    59
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    60
  fun pp (Clause {id,thm,...}) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    61
      if !showId then ppIdThm (id,thm) else Thm.pp thm;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    62
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    63
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    64
fun toString cl = Print.toString pp cl;
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
(* Basic operations.                                                         *)
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
val default : parameters =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    71
    {ordering = KnuthBendixOrder.default,
39443
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39408
diff changeset
    72
     orderLiterals = UnsignedLiteralOrder,
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    73
     orderTerms = true};
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 mk info = Clause info
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 dest (Clause info) = info;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    78
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    79
fun id (Clause {id = i, ...}) = i;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    80
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    81
fun thm (Clause {thm = th, ...}) = th;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    82
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    83
fun equalThms cl cl' = Thm.equal (thm cl) (thm cl');
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    84
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    85
fun new parameters thm =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    86
    Clause {parameters = parameters, id = newId (), thm = thm};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    87
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    88
fun literals cl = Thm.clause (thm cl);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    89
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    90
fun isTautology (Clause {thm,...}) = Thm.isTautology thm;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    91
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    92
fun isContradiction (Clause {thm,...}) = Thm.isContradiction thm;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    93
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    94
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    95
(* The term ordering is used to cut down inferences.                         *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    96
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    97
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    98
fun strictlyLess ordering x_y =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    99
    case KnuthBendixOrder.compare ordering x_y of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   100
      SOME LESS => true
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   101
    | _ => false;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   102
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   103
fun isLargerTerm ({ordering,orderTerms,...} : parameters) l_r =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   104
    not orderTerms orelse not (strictlyLess ordering l_r);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   105
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   106
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   107
  fun atomToTerms atm =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   108
      case total Atom.destEq atm of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   109
        NONE => [Term.Fn atm]
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   110
      | SOME (l,r) => [l,r];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   111
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   112
  fun notStrictlyLess ordering (xs,ys) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   113
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   114
        fun less x = List.exists (fn y => strictlyLess ordering (x,y)) ys
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   115
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   116
        not (List.all less xs)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   117
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   118
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   119
  fun isLargerLiteral ({ordering,orderLiterals,...} : parameters) lits =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   120
      case orderLiterals of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   121
        NoLiteralOrder => K true
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   122
      | UnsignedLiteralOrder =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   123
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   124
          fun addLit ((_,atm),acc) = atomToTerms atm @ acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   125
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   126
          val tms = LiteralSet.foldl addLit [] lits
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   127
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   128
          fn (_,atm') => notStrictlyLess ordering (atomToTerms atm', tms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   129
        end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   130
      | PositiveLiteralOrder =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   131
        case LiteralSet.findl (K true) lits of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   132
          NONE => K true
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   133
        | SOME (pol,_) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   134
          let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   135
            fun addLit ((p,atm),acc) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   136
                if p = pol then atomToTerms atm @ acc else acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   137
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   138
            val tms = LiteralSet.foldl addLit [] lits
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   139
          in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   140
            fn (pol',atm') =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   141
               if pol <> pol' then pol
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   142
               else notStrictlyLess ordering (atomToTerms atm', tms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   143
          end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   144
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   145
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   146
fun largestLiterals (Clause {parameters,thm,...}) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   147
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   148
      val litSet = Thm.clause thm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   149
      val isLarger = isLargerLiteral parameters litSet
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   150
      fun addLit (lit,s) = if isLarger lit then LiteralSet.add s lit else s
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   151
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   152
      LiteralSet.foldr addLit LiteralSet.empty litSet
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   153
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   154
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   155
(*MetisTrace6
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   156
val largestLiterals = fn cl =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   157
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   158
      val ppResult = LiteralSet.pp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   159
      val () = Print.trace pp "Clause.largestLiterals: cl" cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   160
      val result = largestLiterals cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   161
      val () = Print.trace ppResult "Clause.largestLiterals: result" result
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   162
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   163
      result
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   164
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   165
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   166
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   167
fun largestEquations (cl as Clause {parameters,...}) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   168
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   169
      fun addEq lit ort (l_r as (l,_)) acc =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   170
          if isLargerTerm parameters l_r then (lit,ort,l) :: acc else acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   171
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   172
      fun addLit (lit,acc) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   173
          case total Literal.destEq lit of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   174
            NONE => acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   175
          | SOME (l,r) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   176
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   177
              val acc = addEq lit Rewrite.RightToLeft (r,l) acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   178
              val acc = addEq lit Rewrite.LeftToRight (l,r) acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   179
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   180
              acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   181
            end
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
      LiteralSet.foldr addLit [] (largestLiterals cl)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   184
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   185
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   186
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   187
  fun addLit (lit,acc) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   188
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   189
        fun addTm ((path,tm),acc) = (lit,path,tm) :: acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   190
      in
39443
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39408
diff changeset
   191
        List.foldl addTm acc (Literal.nonVarTypedSubterms lit)
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   192
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   193
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   194
  fun largestSubterms cl = LiteralSet.foldl addLit [] (largestLiterals cl);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   195
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   196
  fun allSubterms cl = LiteralSet.foldl addLit [] (literals cl);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   197
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   198
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   199
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   200
(* Subsumption.                                                              *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   201
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   202
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   203
fun subsumes (subs : clause Subsume.subsume) cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   204
    Subsume.isStrictlySubsumed subs (literals cl);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   205
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   206
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   207
(* Simplifying rules: these preserve the clause id.                          *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   208
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   209
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   210
fun freshVars (Clause {parameters,id,thm}) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   211
    Clause {parameters = parameters, id = id, thm = Rule.freshVars thm};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   212
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   213
fun simplify (Clause {parameters,id,thm}) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   214
    case Rule.simplify thm of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   215
      NONE => NONE
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   216
    | SOME thm => SOME (Clause {parameters = parameters, id = id, thm = thm});
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   217
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   218
fun reduce units (Clause {parameters,id,thm}) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   219
    Clause {parameters = parameters, id = id, thm = Units.reduce units thm};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   220
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   221
fun rewrite rewr (cl as Clause {parameters,id,thm}) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   222
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   223
      fun simp th =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   224
          let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   225
            val {ordering,...} = parameters
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   226
            val cmp = KnuthBendixOrder.compare ordering
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
            Rewrite.rewriteIdRule rewr cmp id th
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
(*MetisTrace4
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   232
      val () = Print.trace Rewrite.pp "Clause.rewrite: rewr" rewr
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   233
      val () = Print.trace Print.ppInt "Clause.rewrite: id" id
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   234
      val () = Print.trace pp "Clause.rewrite: cl" cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   235
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   236
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   237
      val thm =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   238
          case Rewrite.peek rewr id of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   239
            NONE => simp thm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   240
          | SOME ((_,thm),_) => if Rewrite.isReduced rewr then thm else simp thm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   241
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   242
      val result = Clause {parameters = parameters, id = id, thm = thm}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   243
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   244
(*MetisTrace4
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   245
      val () = Print.trace pp "Clause.rewrite: result" result
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   246
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   247
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   248
      result
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   249
    end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   250
(*MetisDebug
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   251
    handle Error err => raise Error ("Clause.rewrite:\n" ^ err);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   252
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   253
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   254
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   255
(* Inference rules: these generate new clause ids.                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   256
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   257
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   258
fun factor (cl as Clause {parameters,thm,...}) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   259
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   260
      val lits = largestLiterals cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   261
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   262
      fun apply sub = new parameters (Thm.subst sub thm)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   263
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   264
      map apply (Rule.factor' lits)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   265
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   266
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   267
(*MetisTrace5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   268
val factor = fn cl =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   269
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   270
      val () = Print.trace pp "Clause.factor: cl" cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   271
      val result = factor cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   272
      val () = Print.trace (Print.ppList pp) "Clause.factor: result" result
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   273
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   274
      result
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   275
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   276
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   277
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   278
fun resolve (cl1,lit1) (cl2,lit2) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   279
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   280
(*MetisTrace5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   281
      val () = Print.trace pp "Clause.resolve: cl1" cl1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   282
      val () = Print.trace Literal.pp "Clause.resolve: lit1" lit1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   283
      val () = Print.trace pp "Clause.resolve: cl2" cl2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   284
      val () = Print.trace Literal.pp "Clause.resolve: lit2" lit2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   285
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   286
      val Clause {parameters, thm = th1, ...} = cl1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   287
      and Clause {thm = th2, ...} = cl2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   288
      val sub = Literal.unify Subst.empty lit1 (Literal.negate lit2)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   289
(*MetisTrace5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   290
      val () = Print.trace Subst.pp "Clause.resolve: sub" sub
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   291
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   292
      val lit1 = Literal.subst sub lit1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   293
      val lit2 = Literal.negate lit1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   294
      val th1 = Thm.subst sub th1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   295
      and th2 = Thm.subst sub th2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   296
      val _ = isLargerLiteral parameters (Thm.clause th1) lit1 orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   297
(*MetisTrace5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   298
              (trace "Clause.resolve: th1 violates ordering\n"; false) orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   299
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   300
              raise Error "resolve: clause1: ordering constraints"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   301
      val _ = isLargerLiteral parameters (Thm.clause th2) lit2 orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   302
(*MetisTrace5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   303
              (trace "Clause.resolve: th2 violates ordering\n"; false) orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   304
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   305
              raise Error "resolve: clause2: ordering constraints"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   306
      val th = Thm.resolve lit1 th1 th2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   307
(*MetisTrace5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   308
      val () = Print.trace Thm.pp "Clause.resolve: th" th
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   309
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   310
      val cl = Clause {parameters = parameters, id = newId (), thm = th}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   311
(*MetisTrace5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   312
      val () = Print.trace pp "Clause.resolve: cl" cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   313
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   314
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   315
      cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   316
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   317
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   318
fun paramodulate (cl1,lit1,ort1,tm1) (cl2,lit2,path2,tm2) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   319
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   320
(*MetisTrace5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   321
      val () = Print.trace pp "Clause.paramodulate: cl1" cl1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   322
      val () = Print.trace Literal.pp "Clause.paramodulate: lit1" lit1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   323
      val () = Print.trace Rewrite.ppOrient "Clause.paramodulate: ort1" ort1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   324
      val () = Print.trace Term.pp "Clause.paramodulate: tm1" tm1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   325
      val () = Print.trace pp "Clause.paramodulate: cl2" cl2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   326
      val () = Print.trace Literal.pp "Clause.paramodulate: lit2" lit2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   327
      val () = Print.trace Term.ppPath "Clause.paramodulate: path2" path2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   328
      val () = Print.trace Term.pp "Clause.paramodulate: tm2" tm2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   329
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   330
      val Clause {parameters, thm = th1, ...} = cl1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   331
      and Clause {thm = th2, ...} = cl2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   332
      val sub = Subst.unify Subst.empty tm1 tm2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   333
      val lit1 = Literal.subst sub lit1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   334
      and lit2 = Literal.subst sub lit2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   335
      and th1 = Thm.subst sub th1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   336
      and th2 = Thm.subst sub th2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   337
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   338
      val _ = isLargerLiteral parameters (Thm.clause th1) lit1 orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   339
              raise Error "Clause.paramodulate: with clause: ordering"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   340
      val _ = isLargerLiteral parameters (Thm.clause th2) lit2 orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   341
              raise Error "Clause.paramodulate: into clause: ordering"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   342
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   343
      val eqn = (Literal.destEq lit1, th1)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   344
      val eqn as (l_r,_) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   345
          case ort1 of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   346
            Rewrite.LeftToRight => eqn
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   347
          | Rewrite.RightToLeft => Rule.symEqn eqn
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   348
(*MetisTrace6
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   349
      val () = Print.trace Rule.ppEquation "Clause.paramodulate: eqn" eqn
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   350
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   351
      val _ = isLargerTerm parameters l_r orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   352
              raise Error "Clause.paramodulate: equation: ordering constraints"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   353
      val th = Rule.rewrRule eqn lit2 path2 th2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   354
(*MetisTrace5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   355
      val () = Print.trace Thm.pp "Clause.paramodulate: th" th
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   356
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   357
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   358
      Clause {parameters = parameters, id = newId (), thm = th}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   359
    end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   360
(*MetisTrace5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   361
    handle Error err =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   362
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   363
        val () = trace ("Clause.paramodulate: failed: " ^ err ^ "\n")
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   364
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   365
        raise Error err
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   366
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   367
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   368
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   369
end