src/Tools/Metis/src/Resolution.sml
author blanchet
Wed, 27 Aug 2014 08:41:12 +0200
changeset 58043 a90847f03ec8
parent 42102 fcfd07f122d4
child 72004 913162a47d9f
permissions -rw-r--r--
avoid 'PolyML.makestring'
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 RESOLUTION PROOF PROCEDURE                                            *)
39502
cffceed8e7fa fix license
blanchet
parents: 39501
diff changeset
     3
(* Copyright (c) 2001 Joe Hurd, distributed under the BSD License            *)
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     4
(* ========================================================================= *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     5
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     6
structure Resolution :> Resolution =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     7
struct
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     8
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
     9
open Useful;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    10
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    11
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    12
(* A type of resolution proof procedures.                                    *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    13
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    14
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    15
type parameters =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    16
     {active : Active.parameters,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    17
      waiting : Waiting.parameters};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    18
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    19
datatype resolution =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    20
    Resolution of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    21
      {parameters : parameters,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    22
       active : Active.active,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    23
       waiting : Waiting.waiting};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    24
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    25
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    26
(* Basic operations.                                                         *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    27
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    28
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    29
val default : parameters =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    30
    {active = Active.default,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    31
     waiting = Waiting.default};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    32
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    33
fun new parameters ths =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    34
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    35
      val {active = activeParm, waiting = waitingParm} = parameters
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    36
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    37
      val (active,cls) = Active.new activeParm ths  (* cls = factored ths *)
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    38
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    39
      val waiting = Waiting.new waitingParm cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    40
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    41
      Resolution {parameters = parameters, active = active, waiting = waiting}
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    42
    end
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    43
(*MetisDebug
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    44
    handle e =>
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    45
      let
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    46
        val () = Print.trace Print.ppException "Resolution.new: exception" e
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    47
      in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    48
        raise e
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    49
      end;
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    50
*)
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    51
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    52
fun active (Resolution {active = a, ...}) = a;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    53
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    54
fun waiting (Resolution {waiting = w, ...}) = w;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    55
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    56
val pp =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    57
    Print.ppMap
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    58
      (fn Resolution {active,waiting,...} =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    59
          "Resolution(" ^ Int.toString (Active.size active) ^
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    60
          "<-" ^ Int.toString (Waiting.size waiting) ^ ")")
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    61
      Print.ppString;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    62
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    63
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    64
(* The main proof loop.                                                      *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    65
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    66
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    67
datatype decision =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    68
    Contradiction of Thm.thm
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    69
  | Satisfiable of Thm.thm list;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    70
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    71
datatype state =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    72
    Decided of decision
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    73
  | Undecided of resolution;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    74
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    75
fun iterate res =
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    76
    let
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    77
      val Resolution {parameters,active,waiting} = res
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    78
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    79
(*MetisTrace2
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    80
      val () = Print.trace Active.pp "Resolution.iterate: active" active
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    81
      val () = Print.trace Waiting.pp "Resolution.iterate: waiting" waiting
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    82
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    83
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    84
      case Waiting.remove waiting of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    85
        NONE =>
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    86
        let
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    87
          val sat = Satisfiable (List.map Clause.thm (Active.saturation active))
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    88
        in
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    89
          Decided sat
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    90
        end
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    91
      | SOME ((d,cl),waiting) =>
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    92
        if Clause.isContradiction cl then
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    93
          Decided (Contradiction (Clause.thm cl))
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    94
        else
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    95
          let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    96
(*MetisTrace1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    97
            val () = Print.trace Clause.pp "Resolution.iterate: cl" cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    98
*)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    99
            val (active,cls) = Active.add active cl
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   100
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   101
            val waiting = Waiting.add waiting (d,cls)
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   103
            val res =
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   104
                Resolution
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   105
                  {parameters = parameters,
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   106
                   active = active,
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   107
                   waiting = waiting}
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   108
          in
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   109
            Undecided res
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   110
          end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   111
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   112
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   113
fun loop res =
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   114
    case iterate res of
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   115
      Decided dec => dec
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   116
    | Undecided res => loop res;
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   117
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   118
end