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' |