src/Tools/Metis/src/Problem.sml
author wenzelm
Sat, 09 Jul 2011 21:53:27 +0200
changeset 43721 fad8634cee62
parent 42102 fcfd07f122d4
child 72004 913162a47d9f
permissions -rw-r--r--
echo prover input via raw_messages, for improved protocol tracing;
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
(* CNF PROBLEMS                                                              *)
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 Problem :> Problem =
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
(* Problems.                                                                 *)
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 problem =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    16
     {axioms : Thm.clause list,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    17
      conjecture : Thm.clause list};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    18
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    19
fun toClauses {axioms,conjecture} = axioms @ conjecture;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    20
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    21
fun size prob =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    22
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    23
      fun lits (cl,n) = n + LiteralSet.size cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    24
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    25
      fun syms (cl,n) = n + LiteralSet.symbols cl
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    26
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    27
      fun typedSyms (cl,n) = n + LiteralSet.typedSymbols cl
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 cls = toClauses prob
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    30
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    31
      {clauses = length cls,
39443
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39353
diff changeset
    32
       literals = List.foldl lits 0 cls,
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39353
diff changeset
    33
       symbols = List.foldl syms 0 cls,
e330437cd22a copied the unmodified official Metis 2.3 (15 Sept. 2010) sources into Isabelle
blanchet
parents: 39353
diff changeset
    34
       typedSymbols = List.foldl typedSyms 0 cls}
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    35
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    36
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    37
fun freeVars {axioms,conjecture} =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    38
    NameSet.union
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    39
      (LiteralSet.freeVarsList axioms)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    40
      (LiteralSet.freeVarsList conjecture);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    41
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    42
local
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    43
  fun clauseToFormula cl =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    44
      Formula.listMkDisj (LiteralSet.transform Literal.toFormula cl);
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    45
in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    46
  fun toFormula prob =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    47
      Formula.listMkConj (List.map clauseToFormula (toClauses prob));
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    48
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    49
  fun toGoal {axioms,conjecture} =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    50
      let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    51
        val clToFm = Formula.generalize o clauseToFormula
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    52
        val clsToFm = Formula.listMkConj o List.map clToFm
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    53
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    54
        val fm = Formula.False
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    55
        val fm =
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
    56
            if List.null conjecture then fm
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    57
            else Formula.Imp (clsToFm conjecture, fm)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    58
        val fm = Formula.Imp (clsToFm axioms, fm)
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
        fm
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
end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    63
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    64
fun toString prob = Formula.toString (toFormula prob);
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
(* Categorizing problems.                                                    *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    68
(* ------------------------------------------------------------------------- *)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    69
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    70
datatype propositional =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    71
    Propositional
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    72
  | EffectivelyPropositional
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    73
  | NonPropositional;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    74
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    75
datatype equality =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    76
    NonEquality
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    77
  | Equality
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    78
  | PureEquality;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    79
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    80
datatype horn =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    81
    Trivial
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    82
  | Unit
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    83
  | DoubleHorn
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    84
  | Horn
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    85
  | NegativeHorn
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    86
  | NonHorn;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    87
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    88
type category =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    89
     {propositional : propositional,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    90
      equality : equality,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    91
      horn : horn};
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    92
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    93
fun categorize prob =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    94
    let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    95
      val cls = toClauses prob
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    96
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    97
      val rels =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    98
          let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
    99
            fun f (cl,set) = NameAritySet.union set (LiteralSet.relations cl)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   100
          in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   101
            List.foldl f NameAritySet.empty cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   102
          end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   103
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   104
      val funs =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   105
          let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   106
            fun f (cl,set) = NameAritySet.union set (LiteralSet.functions cl)
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   107
          in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   108
            List.foldl f NameAritySet.empty cls
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   109
          end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   110
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   111
      val propositional =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   112
          if NameAritySet.allNullary rels then Propositional
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   113
          else if NameAritySet.allNullary funs then EffectivelyPropositional
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   114
          else NonPropositional
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   115
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   116
      val equality =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   117
          if not (NameAritySet.member Atom.eqRelation rels) then NonEquality
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   118
          else if NameAritySet.size rels = 1 then PureEquality
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   119
          else Equality
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   120
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   121
      val horn =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   122
          if List.exists LiteralSet.null cls then Trivial
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   123
          else if List.all (fn cl => LiteralSet.size cl = 1) cls then Unit
42102
fcfd07f122d4 new version of Metis 2.3 (29 Dec. 2010)
blanchet
parents: 39502
diff changeset
   124
          else
39348
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   125
            let
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   126
              fun pos cl = LiteralSet.count Literal.positive cl <= 1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   127
              fun neg cl = LiteralSet.count Literal.negative cl <= 1
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   128
            in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   129
              case (List.all pos cls, List.all neg cls) of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   130
                (true,true) => DoubleHorn
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   131
              | (true,false) => Horn
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   132
              | (false,true) => NegativeHorn
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   133
              | (false,false) => NonHorn
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   134
            end
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   135
    in
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   136
      {propositional = propositional,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   137
       equality = equality,
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   138
       horn = horn}
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   139
    end;
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   140
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   141
fun categoryToString {propositional,equality,horn} =
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   142
    (case propositional of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   143
       Propositional => "propositional"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   144
     | EffectivelyPropositional => "effectively propositional"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   145
     | NonPropositional => "non-propositional") ^
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   146
    ", " ^
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   147
    (case equality of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   148
       NonEquality => "non-equality"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   149
     | Equality => "equality"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   150
     | PureEquality => "pure equality") ^
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   151
    ", " ^
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   152
    (case horn of
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   153
       Trivial => "trivial"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   154
     | Unit => "unit"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   155
     | DoubleHorn => "horn (and negative horn)"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   156
     | Horn => "horn"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   157
     | NegativeHorn => "negative horn"
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   158
     | NonHorn => "non-horn");
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   159
6f9c9899f99f new version of the Metis files
blanchet
parents:
diff changeset
   160
end