274 |
274 |
275 |
275 |
276 subsubsection {* Generic cases and induction *} |
276 subsubsection {* Generic cases and induction *} |
277 |
277 |
278 constdefs |
278 constdefs |
279 inductive_forall :: "('a => bool) => bool" |
279 induct_forall :: "('a => bool) => bool" |
280 "inductive_forall P == \<forall>x. P x" |
280 "induct_forall P == \<forall>x. P x" |
281 inductive_implies :: "bool => bool => bool" |
281 induct_implies :: "bool => bool => bool" |
282 "inductive_implies A B == A --> B" |
282 "induct_implies A B == A --> B" |
283 inductive_equal :: "'a => 'a => bool" |
283 induct_equal :: "'a => 'a => bool" |
284 "inductive_equal x y == x = y" |
284 "induct_equal x y == x = y" |
285 inductive_conj :: "bool => bool => bool" |
285 induct_conj :: "bool => bool => bool" |
286 "inductive_conj A B == A & B" |
286 "induct_conj A B == A & B" |
287 |
287 |
288 lemma inductive_forall_eq: "(!!x. P x) == Trueprop (inductive_forall (\<lambda>x. P x))" |
288 lemma induct_forall_eq: "(!!x. P x) == Trueprop (induct_forall (\<lambda>x. P x))" |
289 by (simp only: atomize_all inductive_forall_def) |
289 by (simp only: atomize_all induct_forall_def) |
290 |
290 |
291 lemma inductive_implies_eq: "(A ==> B) == Trueprop (inductive_implies A B)" |
291 lemma induct_implies_eq: "(A ==> B) == Trueprop (induct_implies A B)" |
292 by (simp only: atomize_imp inductive_implies_def) |
292 by (simp only: atomize_imp induct_implies_def) |
293 |
293 |
294 lemma inductive_equal_eq: "(x == y) == Trueprop (inductive_equal x y)" |
294 lemma induct_equal_eq: "(x == y) == Trueprop (induct_equal x y)" |
295 by (simp only: atomize_eq inductive_equal_def) |
295 by (simp only: atomize_eq induct_equal_def) |
296 |
296 |
297 lemma inductive_forall_conj: "inductive_forall (\<lambda>x. inductive_conj (A x) (B x)) = |
297 lemma induct_forall_conj: "induct_forall (\<lambda>x. induct_conj (A x) (B x)) = |
298 inductive_conj (inductive_forall A) (inductive_forall B)" |
298 induct_conj (induct_forall A) (induct_forall B)" |
299 by (unfold inductive_forall_def inductive_conj_def) blast |
299 by (unfold induct_forall_def induct_conj_def) blast |
300 |
300 |
301 lemma inductive_implies_conj: "inductive_implies C (inductive_conj A B) = |
301 lemma induct_implies_conj: "induct_implies C (induct_conj A B) = |
302 inductive_conj (inductive_implies C A) (inductive_implies C B)" |
302 induct_conj (induct_implies C A) (induct_implies C B)" |
303 by (unfold inductive_implies_def inductive_conj_def) blast |
303 by (unfold induct_implies_def induct_conj_def) blast |
304 |
304 |
305 lemma inductive_conj_curry: "(inductive_conj A B ==> C) == (A ==> B ==> C)" |
305 lemma induct_conj_curry: "(induct_conj A B ==> C) == (A ==> B ==> C)" |
306 by (simp only: atomize_imp atomize_eq inductive_conj_def) (rule equal_intr_rule, blast+) |
306 by (simp only: atomize_imp atomize_eq induct_conj_def) (rule equal_intr_rule, blast+) |
307 |
307 |
308 lemmas inductive_atomize = inductive_forall_eq inductive_implies_eq inductive_equal_eq |
308 lemma induct_impliesI: "(A ==> B) ==> induct_implies A B" |
309 lemmas inductive_rulify1 = inductive_atomize [symmetric, standard] |
309 by (simp add: induct_implies_def) |
310 lemmas inductive_rulify2 = |
310 |
311 inductive_forall_def inductive_implies_def inductive_equal_def inductive_conj_def |
311 lemmas induct_atomize = induct_forall_eq induct_implies_eq induct_equal_eq |
312 lemmas inductive_conj = inductive_forall_conj inductive_implies_conj inductive_conj_curry |
312 lemmas induct_rulify1 = induct_atomize [symmetric, standard] |
313 |
313 lemmas induct_rulify2 = |
314 hide const inductive_forall inductive_implies inductive_equal inductive_conj |
314 induct_forall_def induct_implies_def induct_equal_def induct_conj_def |
|
315 lemmas induct_conj = induct_forall_conj induct_implies_conj induct_conj_curry |
|
316 |
|
317 hide const induct_forall induct_implies induct_equal induct_conj |
315 |
318 |
316 |
319 |
317 text {* Method setup. *} |
320 text {* Method setup. *} |
318 |
321 |
319 ML {* |
322 ML {* |
320 structure InductMethod = InductMethodFun |
323 structure InductMethod = InductMethodFun |
321 (struct |
324 (struct |
322 val dest_concls = HOLogic.dest_concls; |
325 val dest_concls = HOLogic.dest_concls; |
323 val cases_default = thm "case_split"; |
326 val cases_default = thm "case_split"; |
|
327 val local_impI = thm "induct_impliesI"; |
324 val conjI = thm "conjI"; |
328 val conjI = thm "conjI"; |
325 val atomize = thms "inductive_atomize"; |
329 val atomize = thms "induct_atomize"; |
326 val rulify1 = thms "inductive_rulify1"; |
330 val rulify1 = thms "induct_rulify1"; |
327 val rulify2 = thms "inductive_rulify2"; |
331 val rulify2 = thms "induct_rulify2"; |
328 end); |
332 end); |
329 *} |
333 *} |
330 |
334 |
331 setup InductMethod.setup |
335 setup InductMethod.setup |
332 |
336 |