src/Tools/Metis/src/Active.sml
author blanchet
Mon, 13 Sep 2010 21:11:59 +0200
changeset 39349 2d0a4361c3ef
parent 39348 6f9c9899f99f
child 39353 7f11d833d65b
permissions -rw-r--r--
change license, with Joe Hurd's permission
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     1
(* ========================================================================= *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     2
(* THE ACTIVE SET OF CLAUSES                                                 *)
39349
2d0a4361c3ef change license, with Joe Hurd's permission
blanchet
parents: 39348
diff changeset
     3
(* Copyright (c) 2002-2006 Joe Hurd, distributed under the BSD License       *)
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     4
(* ========================================================================= *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     6
structure Active :> Active =
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
(*MetisDebug
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    16
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    17
  fun mkRewrite ordering =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    18
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    19
        fun add (cl,rw) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    20
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    21
              val {id, thm = th, ...} = Clause.dest cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    22
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    23
              case total Thm.destUnitEq th of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    24
                SOME l_r => Rewrite.add rw (id,(l_r,th))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    25
              | NONE => rw
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    26
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    27
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    28
        foldl add (Rewrite.new (KnuthBendixOrder.compare ordering))
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
  fun allFactors red =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    32
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    33
        fun allClause cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    34
            List.all red (cl :: Clause.factor cl) orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    35
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    36
              val () = Print.trace Clause.pp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    37
                         "Active.isSaturated.allFactors: cl" cl
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
              false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    40
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    41
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    42
        List.all allClause
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    43
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    44
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    45
  fun allResolutions red =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    46
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    47
        fun allClause2 cl_lit cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    48
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    49
              fun allLiteral2 lit =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    50
                  case total (Clause.resolve cl_lit) (cl,lit) of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    51
                    NONE => true
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    52
                  | SOME cl => allFactors red [cl]
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    53
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    54
              LiteralSet.all allLiteral2 (Clause.literals cl)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    55
            end orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    56
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    57
              val () = Print.trace Clause.pp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    58
                         "Active.isSaturated.allResolutions: cl2" cl
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
              false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    61
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    62
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    63
        fun allClause1 allCls cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    64
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    65
              val cl = Clause.freshVars cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    66
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    67
              fun allLiteral1 lit = List.all (allClause2 (cl,lit)) allCls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    68
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    69
              LiteralSet.all allLiteral1 (Clause.literals cl)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    70
            end orelse
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
              val () = Print.trace Clause.pp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    73
                         "Active.isSaturated.allResolutions: cl1" cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    74
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    75
              false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    76
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    77
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
        fn [] => true
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    80
         | allCls as cl :: cls =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    81
           allClause1 allCls cl andalso allResolutions red cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    82
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    83
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    84
  fun allParamodulations red cls =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    85
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    86
        fun allClause2 cl_lit_ort_tm cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    87
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    88
              fun allLiteral2 lit =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    89
                  let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    90
                    val para = Clause.paramodulate cl_lit_ort_tm
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 allSubterms (path,tm) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    93
                        case total para (cl,lit,path,tm) of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    94
                          NONE => true
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    95
                        | SOME cl => allFactors red [cl]
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    96
                  in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    97
                    List.all allSubterms (Literal.nonVarTypedSubterms lit)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    98
                  end orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    99
                  let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   100
                    val () = Print.trace Literal.pp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   101
                               "Active.isSaturated.allParamodulations: lit2" lit
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
                    false
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
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   106
              LiteralSet.all allLiteral2 (Clause.literals cl)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   107
            end orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   108
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   109
              val () = Print.trace Clause.pp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   110
                         "Active.isSaturated.allParamodulations: cl2" cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   111
              val (_,_,ort,_) = cl_lit_ort_tm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   112
              val () = Print.trace Rewrite.ppOrient
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   113
                         "Active.isSaturated.allParamodulations: ort1" ort
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   114
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   115
              false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   116
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   117
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   118
        fun allClause1 cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   119
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   120
              val cl = Clause.freshVars cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   121
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   122
              fun allLiteral1 lit =
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 allCl2 x = List.all (allClause2 x) cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   125
                  in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   126
                    case total Literal.destEq lit of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   127
                      NONE => true
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   128
                    | SOME (l,r) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   129
                      allCl2 (cl,lit,Rewrite.LeftToRight,l) andalso
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   130
                      allCl2 (cl,lit,Rewrite.RightToLeft,r)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   131
                  end orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   132
                  let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   133
                    val () = Print.trace Literal.pp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   134
                               "Active.isSaturated.allParamodulations: lit1" lit
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   135
                  in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   136
                    false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   137
                  end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   138
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   139
              LiteralSet.all allLiteral1 (Clause.literals cl)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   140
            end orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   141
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   142
              val () = Print.trace Clause.pp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   143
                         "Active.isSaturated.allParamodulations: cl1" cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   144
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   145
              false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   146
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   147
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   148
        List.all allClause1 cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   149
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   150
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   151
  fun redundant {subsume,reduce,rewrite} =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   152
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   153
        fun simp cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   154
            case Clause.simplify cl of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   155
              NONE => true
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   156
            | SOME cl =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   157
              Subsume.isStrictlySubsumed subsume (Clause.literals cl) orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   158
              let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   159
                val cl' = cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   160
                val cl' = Clause.reduce reduce cl'
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   161
                val cl' = Clause.rewrite rewrite cl'
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
                not (Clause.equalThms cl cl') andalso
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   164
                (simp cl' orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   165
                 let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   166
                   val () = Print.trace Clause.pp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   167
                              "Active.isSaturated.redundant: cl'" cl'
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   168
                 in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   169
                   false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   170
                 end)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   171
              end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   172
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   173
        fn cl =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   174
           simp cl orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   175
           let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   176
             val () = Print.trace Clause.pp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   177
                        "Active.isSaturated.redundant: cl" cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   178
           in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   179
             false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   180
           end
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
  fun isSaturated ordering subs cls =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   184
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   185
        val rd = Units.empty
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   186
        val rw = mkRewrite ordering cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   187
        val red = redundant {subsume = subs, reduce = rd, rewrite = rw}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   188
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   189
        (allFactors red cls andalso
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   190
         allResolutions red cls andalso
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   191
         allParamodulations red cls) orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   192
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   193
          val () = Print.trace Rewrite.pp "Active.isSaturated: rw" rw
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   194
          val () = Print.trace (Print.ppList Clause.pp)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   195
                     "Active.isSaturated: clauses" cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   196
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   197
          false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   198
        end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   199
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   200
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   201
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   202
fun checkSaturated ordering subs cls =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   203
    if isSaturated ordering subs cls then ()
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   204
    else raise Bug "Active.checkSaturated";
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
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   208
(* A type of active clause sets.                                             *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   209
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   210
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   211
type simplify = {subsume : bool, reduce : bool, rewrite : bool};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   212
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   213
type parameters =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   214
     {clause : Clause.parameters,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   215
      prefactor : simplify,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   216
      postfactor : simplify};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   217
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   218
datatype active =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   219
    Active of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   220
      {parameters : parameters,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   221
       clauses : Clause.clause IntMap.map,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   222
       units : Units.units,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   223
       rewrite : Rewrite.rewrite,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   224
       subsume : Clause.clause Subsume.subsume,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   225
       literals : (Clause.clause * Literal.literal) LiteralNet.literalNet,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   226
       equations :
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   227
         (Clause.clause * Literal.literal * Rewrite.orient * Term.term)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   228
         TermNet.termNet,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   229
       subterms :
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   230
         (Clause.clause * Literal.literal * Term.path * Term.term)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   231
         TermNet.termNet,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   232
       allSubterms : (Clause.clause * Term.term) TermNet.termNet};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   233
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   234
fun getSubsume (Active {subsume = s, ...}) = s;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   235
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   236
fun setRewrite active rewrite =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   237
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   238
      val Active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   239
            {parameters,clauses,units,subsume,literals,equations,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   240
             subterms,allSubterms,...} = active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   241
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   242
      Active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   243
        {parameters = parameters, clauses = clauses, units = units,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   244
         rewrite = rewrite, subsume = subsume, literals = literals,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   245
         equations = equations, subterms = subterms, allSubterms = allSubterms}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   246
    end;
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
(* Basic operations.                                                         *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   250
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   251
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   252
val maxSimplify : simplify = {subsume = true, reduce = true, rewrite = true};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   253
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   254
val default : parameters =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   255
    {clause = Clause.default,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   256
     prefactor = maxSimplify,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   257
     postfactor = maxSimplify};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   258
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   259
fun empty parameters =
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 {clause,...} = parameters
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   262
      val {ordering,...} = clause
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
      Active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   265
        {parameters = parameters,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   266
         clauses = IntMap.new (),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   267
         units = Units.empty,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   268
         rewrite = Rewrite.new (KnuthBendixOrder.compare ordering),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   269
         subsume = Subsume.new (),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   270
         literals = LiteralNet.new {fifo = false},
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   271
         equations = TermNet.new {fifo = false},
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   272
         subterms = TermNet.new {fifo = false},
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   273
         allSubterms = TermNet.new {fifo = false}}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   274
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   275
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   276
fun size (Active {clauses,...}) = IntMap.size clauses;
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 clauses (Active {clauses = cls, ...}) =
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
      fun add (_,cl,acc) = cl :: acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   281
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   282
      IntMap.foldr add [] cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   283
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   284
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   285
fun saturation active =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   286
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   287
      fun remove (cl,(cls,subs)) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   288
          let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   289
            val lits = Clause.literals cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   290
          in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   291
            if Subsume.isStrictlySubsumed subs lits then (cls,subs)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   292
            else (cl :: cls, Subsume.insert subs (lits,()))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   293
          end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   294
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   295
      val cls = clauses active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   296
      val (cls,_) = foldl remove ([], Subsume.new ()) cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   297
      val (cls,subs) = foldl remove ([], Subsume.new ()) cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   298
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   299
(*MetisDebug
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   300
      val Active {parameters,...} = active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   301
      val {clause,...} = parameters
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   302
      val {ordering,...} = clause
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   303
      val () = checkSaturated ordering subs cls
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
      cls
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
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   310
(* Pretty printing.                                                          *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   311
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   312
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   313
val pp =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   314
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   315
      fun toStr active = "Active{" ^ Int.toString (size active) ^ "}"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   316
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   317
      Print.ppMap toStr Print.ppString
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   318
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   319
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   320
(*MetisDebug
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   321
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   322
  fun ppField f ppA a =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   323
      Print.blockProgram Print.Inconsistent 2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   324
        [Print.addString (f ^ " ="),
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   325
         Print.addBreak 1,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   326
         ppA a];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   327
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   328
  val ppClauses =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   329
      ppField "clauses"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   330
        (Print.ppMap IntMap.toList
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   331
           (Print.ppList (Print.ppPair Print.ppInt Clause.pp)));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   332
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   333
  val ppRewrite = ppField "rewrite" Rewrite.pp;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   334
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   335
  val ppSubterms =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   336
      ppField "subterms"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   337
        (TermNet.pp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   338
           (Print.ppMap (fn (c,l,p,t) => ((Clause.id c, l, p), t))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   339
              (Print.ppPair
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   340
                 (Print.ppTriple Print.ppInt Literal.pp Term.ppPath)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   341
                 Term.pp)));
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   342
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   343
  fun pp (Active {clauses,rewrite,subterms,...}) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   344
      Print.blockProgram Print.Inconsistent 2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   345
        [Print.addString "Active",
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   346
         Print.addBreak 1,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   347
         Print.blockProgram Print.Inconsistent 1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   348
           [Print.addString "{",
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   349
            ppClauses clauses,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   350
            Print.addString ",",
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   351
            Print.addBreak 1,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   352
            ppRewrite rewrite,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   353
(*MetisTrace5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   354
            Print.addString ",",
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   355
            Print.addBreak 1,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   356
            ppSubterms subterms,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   357
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   358
            Print.skip],
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   359
         Print.addString "}"];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   360
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   361
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   362
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   363
val toString = Print.toString pp;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   364
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   365
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   366
(* Simplify clauses.                                                         *)
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
fun simplify simp units rewr subs =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   370
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   371
      val {subsume = s, reduce = r, rewrite = w} = simp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   372
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   373
      fun rewrite cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   374
          let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   375
            val cl' = Clause.rewrite rewr cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   376
          in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   377
            if Clause.equalThms cl cl' then SOME cl else Clause.simplify cl'
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   378
          end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   379
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   380
      fn cl =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   381
         case Clause.simplify cl of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   382
           NONE => NONE
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   383
         | SOME cl =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   384
           case (if w then rewrite cl else SOME cl) of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   385
             NONE => NONE
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   386
           | SOME cl =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   387
             let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   388
               val cl = if r then Clause.reduce units cl else cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   389
             in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   390
               if s andalso Clause.subsumes subs cl then NONE else SOME cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   391
             end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   392
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   393
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   394
(*MetisDebug
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   395
val simplify = fn simp => fn units => fn rewr => fn subs => fn cl =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   396
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   397
      fun traceCl s = Print.trace Clause.pp ("Active.simplify: " ^ s)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   398
(*MetisTrace4
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   399
      val ppClOpt = Print.ppOption Clause.pp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   400
      val () = traceCl "cl" cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   401
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   402
      val cl' = simplify simp units rewr subs cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   403
(*MetisTrace4
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   404
      val () = Print.trace ppClOpt "Active.simplify: cl'" cl'
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   405
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   406
      val () =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   407
          case cl' of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   408
            NONE => ()
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   409
          | SOME cl' =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   410
            case
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   411
              (case simplify simp units rewr subs cl' of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   412
                 NONE => SOME ("away", K ())
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   413
               | SOME cl'' =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   414
                 if Clause.equalThms cl' cl'' then NONE
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   415
                 else SOME ("further", fn () => traceCl "cl''" cl'')) of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   416
              NONE => ()
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   417
            | SOME (e,f) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   418
              let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   419
                val () = traceCl "cl" cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   420
                val () = traceCl "cl'" cl'
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   421
                val () = f ()
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   422
              in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   423
                raise
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   424
                  Bug
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   425
                    ("Active.simplify: clause should have been simplified "^e)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   426
              end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   427
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   428
      cl'
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   429
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   430
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   431
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   432
fun simplifyActive simp active =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   433
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   434
      val Active {units,rewrite,subsume,...} = active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   435
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   436
      simplify simp units rewrite subsume
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   437
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   438
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   439
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   440
(* Add a clause into the active set.                                         *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   441
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   442
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   443
fun addUnit units cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   444
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   445
      val th = Clause.thm cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   446
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   447
      case total Thm.destUnit th of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   448
        SOME lit => Units.add units (lit,th)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   449
      | NONE => units
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   450
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   451
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   452
fun addRewrite rewrite cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   453
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   454
      val th = Clause.thm cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   455
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   456
      case total Thm.destUnitEq th of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   457
        SOME l_r => Rewrite.add rewrite (Clause.id cl, (l_r,th))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   458
      | NONE => rewrite
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   459
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   460
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   461
fun addSubsume subsume cl = Subsume.insert subsume (Clause.literals cl, cl);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   462
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   463
fun addLiterals literals cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   464
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   465
      fun add (lit as (_,atm), literals) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   466
          if Atom.isEq atm then literals
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   467
          else LiteralNet.insert literals (lit,(cl,lit))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   468
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   469
      LiteralSet.foldl add literals (Clause.largestLiterals cl)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   470
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   471
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   472
fun addEquations equations cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   473
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   474
      fun add ((lit,ort,tm),equations) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   475
          TermNet.insert equations (tm,(cl,lit,ort,tm))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   476
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   477
      foldl add equations (Clause.largestEquations cl)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   478
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   479
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   480
fun addSubterms subterms cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   481
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   482
      fun add ((lit,path,tm),subterms) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   483
          TermNet.insert subterms (tm,(cl,lit,path,tm))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   484
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   485
      foldl add subterms (Clause.largestSubterms cl)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   486
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   487
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   488
fun addAllSubterms allSubterms cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   489
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   490
      fun add ((_,_,tm),allSubterms) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   491
          TermNet.insert allSubterms (tm,(cl,tm))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   492
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   493
      foldl add allSubterms (Clause.allSubterms cl)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   494
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   495
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   496
fun addClause active cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   497
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   498
      val Active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   499
            {parameters,clauses,units,rewrite,subsume,literals,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   500
             equations,subterms,allSubterms} = active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   501
      val clauses = IntMap.insert clauses (Clause.id cl, cl)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   502
      and subsume = addSubsume subsume cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   503
      and literals = addLiterals literals cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   504
      and equations = addEquations equations cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   505
      and subterms = addSubterms subterms cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   506
      and allSubterms = addAllSubterms allSubterms cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   507
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   508
      Active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   509
        {parameters = parameters, clauses = clauses, units = units,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   510
         rewrite = rewrite, subsume = subsume, literals = literals,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   511
         equations = equations, subterms = subterms,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   512
         allSubterms = allSubterms}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   513
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   514
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   515
fun addFactorClause active cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   516
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   517
      val Active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   518
            {parameters,clauses,units,rewrite,subsume,literals,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   519
             equations,subterms,allSubterms} = active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   520
      val units = addUnit units cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   521
      and rewrite = addRewrite rewrite cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   522
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   523
      Active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   524
        {parameters = parameters, clauses = clauses, units = units,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   525
         rewrite = rewrite, subsume = subsume, literals = literals,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   526
         equations = equations, subterms = subterms, allSubterms = allSubterms}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   527
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   528
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   529
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   530
(* Derive (unfactored) consequences of a clause.                             *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   531
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   532
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   533
fun deduceResolution literals cl (lit as (_,atm), acc) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   534
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   535
      fun resolve (cl_lit,acc) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   536
          case total (Clause.resolve cl_lit) (cl,lit) of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   537
            SOME cl' => cl' :: acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   538
          | NONE => acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   539
(*MetisTrace4
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   540
      val () = Print.trace Literal.pp "Active.deduceResolution: lit" lit
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   541
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   542
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   543
      if Atom.isEq atm then acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   544
      else foldl resolve acc (LiteralNet.unify literals (Literal.negate lit))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   545
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   546
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   547
fun deduceParamodulationWith subterms cl ((lit,ort,tm),acc) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   548
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   549
      fun para (cl_lit_path_tm,acc) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   550
          case total (Clause.paramodulate (cl,lit,ort,tm)) cl_lit_path_tm of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   551
            SOME cl' => cl' :: acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   552
          | NONE => acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   553
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   554
      foldl para acc (TermNet.unify subterms tm)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   555
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   556
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   557
fun deduceParamodulationInto equations cl ((lit,path,tm),acc) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   558
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   559
      fun para (cl_lit_ort_tm,acc) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   560
          case total (Clause.paramodulate cl_lit_ort_tm) (cl,lit,path,tm) of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   561
            SOME cl' => cl' :: acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   562
          | NONE => acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   563
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   564
      foldl para acc (TermNet.unify equations tm)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   565
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   566
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   567
fun deduce active cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   568
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   569
      val Active {parameters,literals,equations,subterms,...} = active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   570
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   571
      val lits = Clause.largestLiterals cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   572
      val eqns = Clause.largestEquations cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   573
      val subtms =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   574
          if TermNet.null equations then [] else Clause.largestSubterms cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   575
(*MetisTrace5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   576
      val () = Print.trace LiteralSet.pp "Active.deduce: lits" lits
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   577
      val () = Print.trace
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   578
                 (Print.ppList
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   579
                    (Print.ppMap (fn (lit,ort,_) => (lit,ort))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   580
                      (Print.ppPair Literal.pp Rewrite.ppOrient)))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   581
                 "Active.deduce: eqns" eqns
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   582
      val () = Print.trace
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   583
                 (Print.ppList
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   584
                    (Print.ppTriple Literal.pp Term.ppPath Term.pp))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   585
                 "Active.deduce: subtms" subtms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   586
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   587
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   588
      val acc = []
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   589
      val acc = LiteralSet.foldl (deduceResolution literals cl) acc lits
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   590
      val acc = foldl (deduceParamodulationWith subterms cl) acc eqns
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   591
      val acc = foldl (deduceParamodulationInto equations cl) acc subtms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   592
      val acc = rev acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   593
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   594
(*MetisTrace5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   595
      val () = Print.trace (Print.ppList Clause.pp) "Active.deduce: acc" acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   596
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   597
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   598
      acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   599
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   600
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   601
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   602
(* Extract clauses from the active set that can be simplified.               *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   603
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   604
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   605
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   606
  fun clause_rewritables active =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   607
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   608
        val Active {clauses,rewrite,...} = active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   609
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   610
        fun rewr (id,cl,ids) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   611
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   612
              val cl' = Clause.rewrite rewrite cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   613
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   614
              if Clause.equalThms cl cl' then ids else IntSet.add ids id
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   615
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   616
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   617
        IntMap.foldr rewr IntSet.empty clauses
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   618
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   619
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   620
  fun orderedRedexResidues (((l,r),_),ort) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   621
      case ort of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   622
        NONE => []
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   623
      | SOME Rewrite.LeftToRight => [(l,r,true)]
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   624
      | SOME Rewrite.RightToLeft => [(r,l,true)];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   625
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   626
  fun unorderedRedexResidues (((l,r),_),ort) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   627
      case ort of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   628
        NONE => [(l,r,false),(r,l,false)]
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   629
      | SOME _ => [];
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   630
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   631
  fun rewrite_rewritables active rewr_ids =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   632
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   633
        val Active {parameters,rewrite,clauses,allSubterms,...} = active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   634
        val {clause = {ordering,...}, ...} = parameters
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   635
        val order = KnuthBendixOrder.compare ordering
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   636
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   637
        fun addRewr (id,acc) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   638
            if IntMap.inDomain id clauses then IntSet.add acc id else acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   639
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   640
        fun addReduce ((l,r,ord),acc) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   641
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   642
              fun isValidRewr tm =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   643
                  case total (Subst.match Subst.empty l) tm of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   644
                    NONE => false
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   645
                  | SOME sub =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   646
                    ord orelse
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   647
                    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   648
                      val tm' = Subst.subst (Subst.normalize sub) r
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   649
                    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   650
                      order (tm,tm') = SOME GREATER
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   651
                    end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   652
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   653
              fun addRed ((cl,tm),acc) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   654
                  let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   655
(*MetisTrace5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   656
                    val () = Print.trace Clause.pp "Active.addRed: cl" cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   657
                    val () = Print.trace Term.pp "Active.addRed: tm" tm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   658
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   659
                    val id = Clause.id cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   660
                  in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   661
                    if IntSet.member id acc then acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   662
                    else if not (isValidRewr tm) then acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   663
                    else IntSet.add acc id
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   664
                  end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   665
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   666
(*MetisTrace5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   667
              val () = Print.trace Term.pp "Active.addReduce: l" l
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   668
              val () = Print.trace Term.pp "Active.addReduce: r" r
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   669
              val () = Print.trace Print.ppBool "Active.addReduce: ord" ord
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   670
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   671
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   672
              List.foldl addRed acc (TermNet.matched allSubterms l)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   673
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   674
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   675
        fun addEquation redexResidues (id,acc) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   676
            case Rewrite.peek rewrite id of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   677
              NONE => acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   678
            | SOME eqn_ort => List.foldl addReduce acc (redexResidues eqn_ort)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   679
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   680
        val addOrdered = addEquation orderedRedexResidues
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   681
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   682
        val addUnordered = addEquation unorderedRedexResidues
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   683
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   684
        val ids = IntSet.empty
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   685
        val ids = List.foldl addRewr ids rewr_ids
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   686
        val ids = List.foldl addOrdered ids rewr_ids
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   687
        val ids = List.foldl addUnordered ids rewr_ids
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   688
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   689
        ids
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   690
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   691
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   692
  fun choose_clause_rewritables active ids = size active <= length ids
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   693
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   694
  fun rewritables active ids =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   695
      if choose_clause_rewritables active ids then clause_rewritables active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   696
      else rewrite_rewritables active ids;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   697
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   698
(*MetisDebug
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   699
  val rewritables = fn active => fn ids =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   700
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   701
        val clause_ids = clause_rewritables active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   702
        val rewrite_ids = rewrite_rewritables active ids
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   703
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   704
        val () =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   705
            if IntSet.equal rewrite_ids clause_ids then ()
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   706
            else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   707
              let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   708
                val ppIdl = Print.ppList Print.ppInt
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   709
                val ppIds = Print.ppMap IntSet.toList ppIdl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   710
                val () = Print.trace pp "Active.rewritables: active" active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   711
                val () = Print.trace ppIdl "Active.rewritables: ids" ids
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   712
                val () = Print.trace ppIds
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   713
                           "Active.rewritables: clause_ids" clause_ids
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   714
                val () = Print.trace ppIds
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   715
                           "Active.rewritables: rewrite_ids" rewrite_ids
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   716
              in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   717
                raise Bug "Active.rewritables: ~(rewrite_ids SUBSET clause_ids)"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   718
              end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   719
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   720
        if choose_clause_rewritables active ids then clause_ids else rewrite_ids
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   721
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   722
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   723
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   724
  fun delete active ids =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   725
      if IntSet.null ids then active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   726
      else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   727
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   728
          fun idPred id = not (IntSet.member id ids)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   729
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   730
          fun clausePred cl = idPred (Clause.id cl)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   731
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   732
          val Active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   733
                {parameters,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   734
                 clauses,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   735
                 units,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   736
                 rewrite,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   737
                 subsume,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   738
                 literals,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   739
                 equations,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   740
                 subterms,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   741
                 allSubterms} = active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   742
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   743
          val clauses = IntMap.filter (idPred o fst) clauses
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   744
          and subsume = Subsume.filter clausePred subsume
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   745
          and literals = LiteralNet.filter (clausePred o #1) literals
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   746
          and equations = TermNet.filter (clausePred o #1) equations
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   747
          and subterms = TermNet.filter (clausePred o #1) subterms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   748
          and allSubterms = TermNet.filter (clausePred o fst) allSubterms
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   749
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   750
          Active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   751
            {parameters = parameters,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   752
             clauses = clauses,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   753
             units = units,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   754
             rewrite = rewrite,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   755
             subsume = subsume,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   756
             literals = literals,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   757
             equations = equations,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   758
             subterms = subterms,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   759
             allSubterms = allSubterms}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   760
        end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   761
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   762
  fun extract_rewritables (active as Active {clauses,rewrite,...}) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   763
      if Rewrite.isReduced rewrite then (active,[])
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   764
      else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   765
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   766
(*MetisTrace3
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   767
          val () = trace "Active.extract_rewritables: inter-reducing\n"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   768
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   769
          val (rewrite,ids) = Rewrite.reduce' rewrite
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   770
          val active = setRewrite active rewrite
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   771
          val ids = rewritables active ids
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   772
          val cls = IntSet.transform (IntMap.get clauses) ids
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   773
(*MetisTrace3
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   774
          val ppCls = Print.ppList Clause.pp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   775
          val () = Print.trace ppCls "Active.extract_rewritables: cls" cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   776
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   777
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   778
          (delete active ids, cls)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   779
        end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   780
(*MetisDebug
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   781
        handle Error err =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   782
          raise Bug ("Active.extract_rewritables: shouldn't fail\n" ^ err);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   783
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   784
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   785
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   786
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   787
(* Factor clauses.                                                           *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   788
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   789
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   790
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   791
  fun prefactor_simplify active subsume =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   792
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   793
        val Active {parameters,units,rewrite,...} = active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   794
        val {prefactor,...} = parameters
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   795
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   796
        simplify prefactor units rewrite subsume
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   797
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   798
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   799
  fun postfactor_simplify active subsume =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   800
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   801
        val Active {parameters,units,rewrite,...} = active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   802
        val {postfactor,...} = parameters
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   803
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   804
        simplify postfactor units rewrite subsume
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   805
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   806
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   807
  val sort_utilitywise =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   808
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   809
        fun utility cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   810
            case LiteralSet.size (Clause.literals cl) of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   811
              0 => ~1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   812
            | 1 => if Thm.isUnitEq (Clause.thm cl) then 0 else 1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   813
            | n => n
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   814
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   815
        sortMap utility Int.compare
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   816
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   817
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   818
  fun factor_add (cl, active_subsume_acc as (active,subsume,acc)) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   819
      case postfactor_simplify active subsume cl of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   820
        NONE => active_subsume_acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   821
      | SOME cl =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   822
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   823
          val active = addFactorClause active cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   824
          and subsume = addSubsume subsume cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   825
          and acc = cl :: acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   826
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   827
          (active,subsume,acc)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   828
        end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   829
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   830
  fun factor1 (cl, active_subsume_acc as (active,subsume,_)) =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   831
      case prefactor_simplify active subsume cl of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   832
        NONE => active_subsume_acc
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   833
      | SOME cl =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   834
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   835
          val cls = sort_utilitywise (cl :: Clause.factor cl)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   836
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   837
          foldl factor_add active_subsume_acc cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   838
        end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   839
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   840
  fun factor' active acc [] = (active, rev acc)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   841
    | factor' active acc cls =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   842
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   843
        val cls = sort_utilitywise cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   844
        val subsume = getSubsume active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   845
        val (active,_,acc) = foldl factor1 (active,subsume,acc) cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   846
        val (active,cls) = extract_rewritables active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   847
      in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   848
        factor' active acc cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   849
      end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   850
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   851
  fun factor active cls = factor' active [] cls;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   852
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   853
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   854
(*MetisTrace4
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   855
val factor = fn active => fn cls =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   856
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   857
      val ppCls = Print.ppList Clause.pp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   858
      val () = Print.trace ppCls "Active.factor: cls" cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   859
      val (active,cls') = factor active cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   860
      val () = Print.trace ppCls "Active.factor: cls'" cls'
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   861
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   862
      (active,cls')
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   863
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   864
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   865
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   866
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   867
(* Create a new active clause set and initialize clauses.                    *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   868
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   869
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   870
fun new parameters {axioms,conjecture} =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   871
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   872
      val {clause,...} = parameters
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   873
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   874
      fun mk_clause th =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   875
          Clause.mk {parameters = clause, id = Clause.newId (), thm = th}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   876
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   877
      val active = empty parameters
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   878
      val (active,axioms) = factor active (map mk_clause axioms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   879
      val (active,conjecture) = factor active (map mk_clause conjecture)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   880
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   881
      (active, {axioms = axioms, conjecture = conjecture})
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   882
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   883
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   884
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   885
(* Add a clause into the active set and deduce all consequences.             *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   886
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   887
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   888
fun add active cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   889
    case simplifyActive maxSimplify active cl of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   890
      NONE => (active,[])
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   891
    | SOME cl' =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   892
      if Clause.isContradiction cl' then (active,[cl'])
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   893
      else if not (Clause.equalThms cl cl') then factor active [cl']
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   894
      else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   895
        let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   896
(*MetisTrace2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   897
          val () = Print.trace Clause.pp "Active.add: cl" cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   898
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   899
          val active = addClause active cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   900
          val cl = Clause.freshVars cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   901
          val cls = deduce active cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   902
          val (active,cls) = factor active cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   903
(*MetisTrace2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   904
          val ppCls = Print.ppList Clause.pp
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   905
          val () = Print.trace ppCls "Active.add: cls" cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   906
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   907
        in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   908
          (active,cls)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   909
        end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   910
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   911
end