src/Tools/Metis/src/Proof.sml
changeset 25430 372d6749f00e
parent 23510 4521fead5609
child 39353 7f11d833d65b
equal deleted inserted replaced
25429:9e14fbd43e6b 25430:372d6749f00e
    32   | inferenceType (Resolve _) = Thm.Resolve
    32   | inferenceType (Resolve _) = Thm.Resolve
    33   | inferenceType (Refl _) = Thm.Refl
    33   | inferenceType (Refl _) = Thm.Refl
    34   | inferenceType (Equality _) = Thm.Equality;
    34   | inferenceType (Equality _) = Thm.Equality;
    35 
    35 
    36 local
    36 local
    37   open Parser;
    37   fun ppAssume pp atm = (Parser.addBreak pp (1,0); Atom.pp pp atm);
    38 
       
    39   fun ppAssume pp atm = (addBreak pp (1,0); Atom.pp pp atm);
       
    40 
    38 
    41   fun ppSubst ppThm pp (sub,thm) =
    39   fun ppSubst ppThm pp (sub,thm) =
    42       (addBreak pp (1,0);
    40       (Parser.addBreak pp (1,0);
    43        beginBlock pp Inconsistent 1;
    41        Parser.beginBlock pp Parser.Inconsistent 1;
    44        addString pp "{";
    42        Parser.addString pp "{";
    45        ppBinop " =" ppString Subst.pp pp ("sub",sub);
    43        Parser.ppBinop " =" Parser.ppString Subst.pp pp ("sub",sub);
    46        addString pp ","; addBreak pp (1,0);
    44        Parser.addString pp ",";
    47        ppBinop " =" ppString ppThm pp ("thm",thm);
    45        Parser.addBreak pp (1,0);
    48        addString pp "}";
    46        Parser.ppBinop " =" Parser.ppString ppThm pp ("thm",thm);
    49        endBlock pp);
    47        Parser.addString pp "}";
       
    48        Parser.endBlock pp);
    50 
    49 
    51   fun ppResolve ppThm pp (res,pos,neg) =
    50   fun ppResolve ppThm pp (res,pos,neg) =
    52       (addBreak pp (1,0);
    51       (Parser.addBreak pp (1,0);
    53        beginBlock pp Inconsistent 1;
    52        Parser.beginBlock pp Parser.Inconsistent 1;
    54        addString pp "{";
    53        Parser.addString pp "{";
    55        ppBinop " =" ppString Atom.pp pp ("res",res);
    54        Parser.ppBinop " =" Parser.ppString Atom.pp pp ("res",res);
    56        addString pp ","; addBreak pp (1,0);
    55        Parser.addString pp ",";
    57        ppBinop " =" ppString ppThm pp ("pos",pos);
    56        Parser.addBreak pp (1,0);
    58        addString pp ","; addBreak pp (1,0);
    57        Parser.ppBinop " =" Parser.ppString ppThm pp ("pos",pos);
    59        ppBinop " =" ppString ppThm pp ("neg",neg);
    58        Parser.addString pp ",";
    60        addString pp "}";
    59        Parser.addBreak pp (1,0);
    61        endBlock pp);
    60        Parser.ppBinop " =" Parser.ppString ppThm pp ("neg",neg);
    62 
    61        Parser.addString pp "}";
    63   fun ppRefl pp tm = (addBreak pp (1,0); Term.pp pp tm);
    62        Parser.endBlock pp);
       
    63 
       
    64   fun ppRefl pp tm = (Parser.addBreak pp (1,0); Term.pp pp tm);
    64 
    65 
    65   fun ppEquality pp (lit,path,res) =
    66   fun ppEquality pp (lit,path,res) =
    66       (addBreak pp (1,0);
    67       (Parser.addBreak pp (1,0);
    67        beginBlock pp Inconsistent 1;
    68        Parser.beginBlock pp Parser.Inconsistent 1;
    68        addString pp "{";
    69        Parser.addString pp "{";
    69        ppBinop " =" ppString Literal.pp pp ("lit",lit);
    70        Parser.ppBinop " =" Parser.ppString Literal.pp pp ("lit",lit);
    70        addString pp ","; addBreak pp (1,0);
    71        Parser.addString pp ",";
    71        ppBinop " =" ppString (ppList ppInt) pp ("path",path);
    72        Parser.addBreak pp (1,0);
    72        addString pp ","; addBreak pp (1,0);
    73        Parser.ppBinop " =" Parser.ppString Term.ppPath pp ("path",path);
    73        ppBinop " =" ppString Term.pp pp ("res",res);
    74        Parser.addString pp ",";
    74        addString pp "}";
    75        Parser.addBreak pp (1,0);
    75        endBlock pp);
    76        Parser.ppBinop " =" Parser.ppString Term.pp pp ("res",res);
       
    77        Parser.addString pp "}";
       
    78        Parser.endBlock pp);
    76 
    79 
    77   fun ppInf ppAxiom ppThm pp inf =
    80   fun ppInf ppAxiom ppThm pp inf =
    78       let
    81       let
    79         val infString = Thm.inferenceTypeToString (inferenceType inf)
    82         val infString = Thm.inferenceTypeToString (inferenceType inf)
    80       in
    83       in
    81         beginBlock pp Inconsistent (size infString + 1);
    84         Parser.beginBlock pp Parser.Inconsistent (size infString + 1);
    82         ppString pp infString;
    85         Parser.ppString pp infString;
    83         case inf of
    86         case inf of
    84           Axiom cl => ppAxiom pp cl
    87           Axiom cl => ppAxiom pp cl
    85         | Assume x => ppAssume pp x
    88         | Assume x => ppAssume pp x
    86         | Subst x => ppSubst ppThm pp x
    89         | Subst x => ppSubst ppThm pp x
    87         | Resolve x => ppResolve ppThm pp x
    90         | Resolve x => ppResolve ppThm pp x
    88         | Refl x => ppRefl pp x
    91         | Refl x => ppRefl pp x
    89         | Equality x => ppEquality pp x;
    92         | Equality x => ppEquality pp x;
    90         endBlock pp
    93         Parser.endBlock pp
    91       end;
    94       end;
    92 
    95 
    93   fun ppAxiom pp cl =
    96   fun ppAxiom pp cl =
    94       (addBreak pp (1,0);
    97       (Parser.addBreak pp (1,0);
    95        ppMap
    98        Parser.ppMap
    96          LiteralSet.toList
    99          LiteralSet.toList
    97          (ppBracket "{" "}" (ppSequence "," Literal.pp)) pp cl);
   100          (Parser.ppBracket "{" "}" (Parser.ppSequence "," Literal.pp)) pp cl);
    98 in
   101 in
    99   val ppInference = ppInf ppAxiom Thm.pp;
   102   val ppInference = ppInf ppAxiom Thm.pp;
   100 
   103 
   101   fun pp p prf =
   104   fun pp p prf =
   102       let
   105       let
   109               val cl = Thm.clause th
   112               val cl = Thm.clause th
   110 
   113 
   111               fun pred (_,(th',_)) = LiteralSet.equal (Thm.clause th') cl
   114               fun pred (_,(th',_)) = LiteralSet.equal (Thm.clause th') cl
   112             in
   115             in
   113               case List.find pred prf of
   116               case List.find pred prf of
   114                 NONE => addString p "(???)"
   117                 NONE => Parser.addString p "(?)"
   115               | SOME (n,_) => addString p (thmString n)
   118               | SOME (n,_) => Parser.addString p (thmString n)
   116             end
   119             end
   117 
   120 
   118         fun ppStep (n,(th,inf)) =
   121         fun ppStep (n,(th,inf)) =
   119             let
   122             let
   120               val s = thmString n
   123               val s = thmString n
   121             in
   124             in
   122               beginBlock p Consistent (1 + size s);
   125               Parser.beginBlock p Parser.Consistent (1 + size s);
   123               addString p (s ^ " ");
   126               Parser.addString p (s ^ " ");
   124               Thm.pp p th;
   127               Thm.pp p th;
   125               addBreak p (2,0);
   128               Parser.addBreak p (2,0);
   126               ppBracket "[" "]" (ppInf (K (K ())) ppThm) p inf;
   129               Parser.ppBracket "[" "]" (ppInf (K (K ())) ppThm) p inf;
   127               endBlock p;
   130               Parser.endBlock p;
   128               addNewline p
   131               Parser.addNewline p
   129             end
   132             end
   130       in
   133       in
   131         beginBlock p Consistent 0;
   134         Parser.beginBlock p Parser.Consistent 0;
   132         addString p "START OF PROOF";
   135         Parser.addString p "START OF PROOF";
   133         addNewline p;
   136         Parser.addNewline p;
   134         app ppStep prf;
   137         app ppStep prf;
   135         addString p "END OF PROOF";
   138         Parser.addString p "END OF PROOF";
   136         addNewline p;
   139         Parser.addNewline p;
   137         endBlock p
   140         Parser.endBlock p
   138       end
   141       end
   139 (*DEBUG
   142 (*DEBUG
   140       handle Error err => raise Bug ("Proof.pp: shouldn't fail:\n" ^ err);
   143       handle Error err => raise Bug ("Proof.pp: shouldn't fail:\n" ^ err);
   141 *)
   144 *)
   142 
   145 
   147 val toString = Parser.toString pp;
   150 val toString = Parser.toString pp;
   148 
   151 
   149 (* ------------------------------------------------------------------------- *)
   152 (* ------------------------------------------------------------------------- *)
   150 (* Reconstructing single inferences.                                         *)
   153 (* Reconstructing single inferences.                                         *)
   151 (* ------------------------------------------------------------------------- *)
   154 (* ------------------------------------------------------------------------- *)
       
   155 
       
   156 fun parents (Axiom _) = []
       
   157   | parents (Assume _) = []
       
   158   | parents (Subst (_,th)) = [th]
       
   159   | parents (Resolve (_,th,th')) = [th,th']
       
   160   | parents (Refl _) = []
       
   161   | parents (Equality _) = [];
   152 
   162 
   153 fun inferenceToThm (Axiom cl) = Thm.axiom cl
   163 fun inferenceToThm (Axiom cl) = Thm.axiom cl
   154   | inferenceToThm (Assume atm) = Thm.assume (true,atm)
   164   | inferenceToThm (Assume atm) = Thm.assume (true,atm)
   155   | inferenceToThm (Subst (sub,th)) = Thm.subst sub th
   165   | inferenceToThm (Subst (sub,th)) = Thm.subst sub th
   156   | inferenceToThm (Resolve (atm,th,th')) = Thm.resolve (true,atm) th th'
   166   | inferenceToThm (Resolve (atm,th,th')) = Thm.resolve (true,atm) th th'