160 res_inst_tac ctxt [(("P", 0), s)] @{thm cut} i THEN rtac @{thm thinL} (i+1) |
160 res_inst_tac ctxt [(("P", 0), s)] @{thm cut} i THEN rtac @{thm thinL} (i+1) |
161 *} |
161 *} |
162 |
162 |
163 |
163 |
164 (** If-and-only-if rules **) |
164 (** If-and-only-if rules **) |
165 lemma iffR: |
165 lemma iffR: |
166 "[| $H,P |- $E,Q,$F; $H,Q |- $E,P,$F |] ==> $H |- $E, P <-> Q, $F" |
166 "[| $H,P |- $E,Q,$F; $H,Q |- $E,P,$F |] ==> $H |- $E, P <-> Q, $F" |
167 apply (unfold iff_def) |
167 apply (unfold iff_def) |
168 apply (assumption | rule conjR impR)+ |
168 apply (assumption | rule conjR impR)+ |
169 done |
169 done |
170 |
170 |
171 lemma iffL: |
171 lemma iffL: |
172 "[| $H,$G |- $E,P,Q; $H,Q,P,$G |- $E |] ==> $H, P <-> Q, $G |- $E" |
172 "[| $H,$G |- $E,P,Q; $H,Q,P,$G |- $E |] ==> $H, P <-> Q, $G |- $E" |
173 apply (unfold iff_def) |
173 apply (unfold iff_def) |
174 apply (assumption | rule conjL impL basic)+ |
174 apply (assumption | rule conjL impL basic)+ |
175 done |
175 done |
176 |
176 |
208 apply (erule thinR) |
208 apply (erule thinR) |
209 done |
209 done |
210 |
210 |
211 (*The rules of LK*) |
211 (*The rules of LK*) |
212 |
212 |
|
213 lemmas [safe] = |
|
214 iffR iffL |
|
215 notR notL |
|
216 impR impL |
|
217 disjR disjL |
|
218 conjR conjL |
|
219 FalseL TrueR |
|
220 refl basic |
|
221 ML {* val prop_pack = Cla.get_pack @{context} *} |
|
222 |
|
223 lemmas [safe] = exL allR |
|
224 lemmas [unsafe] = the_equality exR_thin allL_thin |
|
225 ML {* val LK_pack = Cla.get_pack @{context} *} |
|
226 |
213 ML {* |
227 ML {* |
214 val prop_pack = empty_pack add_safes |
228 val LK_dup_pack = |
215 [@{thm basic}, @{thm refl}, @{thm TrueR}, @{thm FalseL}, |
229 Cla.put_pack prop_pack @{context} |
216 @{thm conjL}, @{thm conjR}, @{thm disjL}, @{thm disjR}, @{thm impL}, @{thm impR}, |
230 |> fold_rev Cla.add_safe @{thms allR exL} |
217 @{thm notL}, @{thm notR}, @{thm iffL}, @{thm iffR}]; |
231 |> fold_rev Cla.add_unsafe @{thms allL exR the_equality} |
218 |
232 |> Cla.get_pack; |
219 val LK_pack = prop_pack add_safes [@{thm allR}, @{thm exL}] |
|
220 add_unsafes [@{thm allL_thin}, @{thm exR_thin}, @{thm the_equality}]; |
|
221 |
|
222 val LK_dup_pack = prop_pack add_safes [@{thm allR}, @{thm exL}] |
|
223 add_unsafes [@{thm allL}, @{thm exR}, @{thm the_equality}]; |
|
224 |
|
225 |
|
226 fun lemma_tac th i = |
|
227 rtac (@{thm thinR} RS @{thm cut}) i THEN REPEAT (rtac @{thm thinL} i) THEN rtac th i; |
|
228 *} |
233 *} |
229 |
234 |
230 method_setup fast_prop = {* Scan.succeed (K (SIMPLE_METHOD' (fast_tac prop_pack))) *} |
235 ML {* |
231 method_setup fast = {* Scan.succeed (K (SIMPLE_METHOD' (fast_tac LK_pack))) *} |
236 fun lemma_tac th i = |
232 method_setup fast_dup = {* Scan.succeed (K (SIMPLE_METHOD' (fast_tac LK_dup_pack))) *} |
237 rtac (@{thm thinR} RS @{thm cut}) i THEN |
233 method_setup best = {* Scan.succeed (K (SIMPLE_METHOD' (best_tac LK_pack))) *} |
238 REPEAT (rtac @{thm thinL} i) THEN |
234 method_setup best_dup = {* Scan.succeed (K (SIMPLE_METHOD' (best_tac LK_dup_pack))) *} |
239 rtac th i; |
|
240 *} |
|
241 |
|
242 |
|
243 method_setup fast_prop = |
|
244 {* Scan.succeed (fn ctxt => SIMPLE_METHOD' (Cla.fast_tac (Cla.put_pack prop_pack ctxt))) *} |
|
245 |
|
246 method_setup fast_dup = |
|
247 {* Scan.succeed (fn ctxt => SIMPLE_METHOD' (Cla.fast_tac (Cla.put_pack LK_dup_pack ctxt))) *} |
|
248 |
|
249 method_setup best_dup = |
|
250 {* Scan.succeed (fn ctxt => SIMPLE_METHOD' (Cla.best_tac (Cla.put_pack LK_dup_pack ctxt))) *} |
235 |
251 |
236 |
252 |
237 lemma mp_R: |
253 lemma mp_R: |
238 assumes major: "$H |- $E, $F, P --> Q" |
254 assumes major: "$H |- $E, $F, P --> Q" |
239 and minor: "$H |- $E, $F, P" |
255 and minor: "$H |- $E, $F, P" |
240 shows "$H |- $E, Q, $F" |
256 shows "$H |- $E, Q, $F" |
241 apply (rule thinRS [THEN cut], rule major) |
257 apply (rule thinRS [THEN cut], rule major) |
242 apply (tactic "step_tac LK_pack 1") |
258 apply step |
243 apply (rule thinR, rule minor) |
259 apply (rule thinR, rule minor) |
244 done |
260 done |
245 |
261 |
246 lemma mp_L: |
262 lemma mp_L: |
247 assumes major: "$H, $G |- $E, P --> Q" |
263 assumes major: "$H, $G |- $E, P --> Q" |
248 and minor: "$H, $G, Q |- $E" |
264 and minor: "$H, $G, Q |- $E" |
249 shows "$H, P, $G |- $E" |
265 shows "$H, P, $G |- $E" |
250 apply (rule thinL [THEN cut], rule major) |
266 apply (rule thinL [THEN cut], rule major) |
251 apply (tactic "step_tac LK_pack 1") |
267 apply step |
252 apply (rule thinL, rule minor) |
268 apply (rule thinL, rule minor) |
253 done |
269 done |
254 |
270 |
255 |
271 |
256 (** Two rules to generate left- and right- rules from implications **) |
272 (** Two rules to generate left- and right- rules from implications **) |