1 (* ========================================================================= *) |
1 (* ========================================================================= *) |
2 (* CLAUSE = ID + THEOREM *) |
2 (* CLAUSE = ID + THEOREM *) |
3 (* Copyright (c) 2002 Joe Hurd, distributed under the BSD License *) |
3 (* Copyright (c) 2002 Joe Leslie-Hurd, distributed under the BSD License *) |
4 (* ========================================================================= *) |
4 (* ========================================================================= *) |
5 |
5 |
6 structure Clause :> Clause = |
6 structure Clause :> Clause = |
7 struct |
7 struct |
8 |
8 |
216 | SOME thm => SOME (Clause {parameters = parameters, id = id, thm = thm}); |
216 | SOME thm => SOME (Clause {parameters = parameters, id = id, thm = thm}); |
217 |
217 |
218 fun reduce units (Clause {parameters,id,thm}) = |
218 fun reduce units (Clause {parameters,id,thm}) = |
219 Clause {parameters = parameters, id = id, thm = Units.reduce units thm}; |
219 Clause {parameters = parameters, id = id, thm = Units.reduce units thm}; |
220 |
220 |
221 fun rewrite rewr (cl as Clause {parameters,id,thm}) = |
221 local |
222 let |
222 fun simp rewr (parm : parameters) id th = |
223 fun simp th = |
223 let |
224 let |
224 val {ordering,...} = parm |
225 val {ordering,...} = parameters |
225 val cmp = KnuthBendixOrder.compare ordering |
226 val cmp = KnuthBendixOrder.compare ordering |
226 in |
227 in |
227 Rewrite.rewriteIdRule rewr cmp id th |
228 Rewrite.rewriteIdRule rewr cmp id th |
228 end; |
229 end |
229 in |
|
230 fun rewrite rewr cl = |
|
231 let |
|
232 val Clause {parameters = parm, id, thm = th} = cl |
230 |
233 |
231 (*MetisTrace4 |
234 (*MetisTrace4 |
232 val () = Print.trace Rewrite.pp "Clause.rewrite: rewr" rewr |
235 val () = Print.trace Rewrite.pp "Clause.rewrite: rewr" rewr |
233 val () = Print.trace Print.ppInt "Clause.rewrite: id" id |
236 val () = Print.trace Print.ppInt "Clause.rewrite: id" id |
234 val () = Print.trace pp "Clause.rewrite: cl" cl |
237 val () = Print.trace pp "Clause.rewrite: cl" cl |
235 *) |
238 *) |
236 |
239 |
237 val thm = |
240 val th = |
238 case Rewrite.peek rewr id of |
241 case Rewrite.peek rewr id of |
239 NONE => simp thm |
242 NONE => simp rewr parm id th |
240 | SOME ((_,thm),_) => if Rewrite.isReduced rewr then thm else simp thm |
243 | SOME ((_,th),_) => |
241 |
244 if Rewrite.isReduced rewr then th else simp rewr parm id th |
242 val result = Clause {parameters = parameters, id = id, thm = thm} |
245 |
|
246 val result = Clause {parameters = parm, id = id, thm = th} |
243 |
247 |
244 (*MetisTrace4 |
248 (*MetisTrace4 |
245 val () = Print.trace pp "Clause.rewrite: result" result |
249 val () = Print.trace pp "Clause.rewrite: result" result |
246 *) |
250 *) |
247 in |
251 in |
248 result |
252 result |
249 end |
253 end |
250 (*MetisDebug |
254 (*MetisDebug |
251 handle Error err => raise Error ("Clause.rewrite:\n" ^ err); |
255 handle Error err => raise Error ("Clause.rewrite:\n" ^ err); |
252 *) |
256 *) |
|
257 end; |
253 |
258 |
254 (* ------------------------------------------------------------------------- *) |
259 (* ------------------------------------------------------------------------- *) |
255 (* Inference rules: these generate new clause ids. *) |
260 (* Inference rules: these generate new clause ids. *) |
256 (* ------------------------------------------------------------------------- *) |
261 (* ------------------------------------------------------------------------- *) |
257 |
262 |