| author | wenzelm | 
| Wed, 05 Nov 1997 19:39:34 +0100 | |
| changeset 4176 | 84a0bfbd74e5 | 
| parent 4096 | 8cdf672a83e8 | 
| child 4186 | e39f28f94cf8 | 
| permissions | -rw-r--r-- | 
| 1459 | 1 | (* Title: FOL/FOL.ML | 
| 0 | 2 | ID: $Id$ | 
| 1459 | 3 | Author: Lawrence C Paulson, Cambridge University Computer Laboratory | 
| 0 | 4 | Copyright 1991 University of Cambridge | 
| 5 | ||
| 1280 | 6 | Tactics and lemmas for FOL.thy (classical First-Order Logic) | 
| 0 | 7 | *) | 
| 8 | ||
| 9 | open FOL; | |
| 10 | ||
| 11 | ||
| 2576 
390c9fb786b5
Declaration of ccontr (classical contradiction) for HOL compatibility
 paulson parents: 
2469diff
changeset | 12 | val ccontr = FalseE RS classical; | 
| 
390c9fb786b5
Declaration of ccontr (classical contradiction) for HOL compatibility
 paulson parents: 
2469diff
changeset | 13 | |
| 0 | 14 | (*** Classical introduction rules for | and EX ***) | 
| 15 | ||
| 779 | 16 | qed_goal "disjCI" FOL.thy | 
| 0 | 17 | "(~Q ==> P) ==> P|Q" | 
| 18 | (fn prems=> | |
| 1459 | 19 | [ (rtac classical 1), | 
| 0 | 20 | (REPEAT (ares_tac (prems@[disjI1,notI]) 1)), | 
| 21 | (REPEAT (ares_tac (prems@[disjI2,notE]) 1)) ]); | |
| 22 | ||
| 23 | (*introduction rule involving only EX*) | |
| 779 | 24 | qed_goal "ex_classical" FOL.thy | 
| 3835 | 25 | "( ~(EX x. P(x)) ==> P(a)) ==> EX x. P(x)" | 
| 0 | 26 | (fn prems=> | 
| 1459 | 27 | [ (rtac classical 1), | 
| 0 | 28 | (eresolve_tac (prems RL [exI]) 1) ]); | 
| 29 | ||
| 30 | (*version of above, simplifying ~EX to ALL~ *) | |
| 779 | 31 | qed_goal "exCI" FOL.thy | 
| 3835 | 32 | "(ALL x. ~P(x) ==> P(a)) ==> EX x. P(x)" | 
| 0 | 33 | (fn [prem]=> | 
| 1459 | 34 | [ (rtac ex_classical 1), | 
| 0 | 35 | (resolve_tac [notI RS allI RS prem] 1), | 
| 1459 | 36 | (etac notE 1), | 
| 37 | (etac exI 1) ]); | |
| 0 | 38 | |
| 779 | 39 | qed_goal "excluded_middle" FOL.thy "~P | P" | 
| 0 | 40 | (fn _=> [ rtac disjCI 1, assume_tac 1 ]); | 
| 41 | ||
| 440 | 42 | (*For disjunctive case analysis*) | 
| 43 | fun excluded_middle_tac sP = | |
| 44 |     res_inst_tac [("Q",sP)] (excluded_middle RS disjE);
 | |
| 0 | 45 | |
| 46 | (*** Special elimination rules *) | |
| 47 | ||
| 48 | ||
| 49 | (*Classical implies (-->) elimination. *) | |
| 779 | 50 | qed_goal "impCE" FOL.thy | 
| 0 | 51 | "[| P-->Q; ~P ==> R; Q ==> R |] ==> R" | 
| 52 | (fn major::prems=> | |
| 53 | [ (resolve_tac [excluded_middle RS disjE] 1), | |
| 54 | (DEPTH_SOLVE (ares_tac (prems@[major RS mp]) 1)) ]); | |
| 55 | ||
| 56 | (*Double negation law*) | |
| 779 | 57 | qed_goal "notnotD" FOL.thy "~~P ==> P" | 
| 0 | 58 | (fn [major]=> | 
| 1459 | 59 | [ (rtac classical 1), (eresolve_tac [major RS notE] 1) ]); | 
| 0 | 60 | |
| 61 | ||
| 62 | (*** Tactics for implication and contradiction ***) | |
| 63 | ||
| 64 | (*Classical <-> elimination. Proof substitutes P=Q in | |
| 65 | ~P ==> ~Q and P ==> Q *) | |
| 779 | 66 | qed_goalw "iffCE" FOL.thy [iff_def] | 
| 0 | 67 | "[| P<->Q; [| P; Q |] ==> R; [| ~P; ~Q |] ==> R |] ==> R" | 
| 68 | (fn prems => | |
| 1459 | 69 | [ (rtac conjE 1), | 
| 0 | 70 | (REPEAT (DEPTH_SOLVE_1 | 
| 1459 | 71 | (etac impCE 1 ORELSE mp_tac 1 ORELSE ares_tac prems 1))) ]); | 
| 2469 | 72 |