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