equal
deleted
inserted
replaced
382 |
382 |
383 subsection {* Proof by cases and induction *} |
383 subsection {* Proof by cases and induction *} |
384 |
384 |
385 text {* Proper handling of non-atomic rule statements. *} |
385 text {* Proper handling of non-atomic rule statements. *} |
386 |
386 |
387 definition "induct_forall(P) == \<forall>x. P(x)" |
387 context |
388 definition "induct_implies(A, B) == A \<longrightarrow> B" |
388 begin |
389 definition "induct_equal(x, y) == x = y" |
389 |
390 definition "induct_conj(A, B) == A \<and> B" |
390 restricted definition "induct_forall(P) == \<forall>x. P(x)" |
|
391 restricted definition "induct_implies(A, B) == A \<longrightarrow> B" |
|
392 restricted definition "induct_equal(x, y) == x = y" |
|
393 restricted definition "induct_conj(A, B) == A \<and> B" |
391 |
394 |
392 lemma induct_forall_eq: "(!!x. P(x)) == Trueprop(induct_forall(\<lambda>x. P(x)))" |
395 lemma induct_forall_eq: "(!!x. P(x)) == Trueprop(induct_forall(\<lambda>x. P(x)))" |
393 unfolding atomize_all induct_forall_def . |
396 unfolding atomize_all induct_forall_def . |
394 |
397 |
395 lemma induct_implies_eq: "(A ==> B) == Trueprop(induct_implies(A, B))" |
398 lemma induct_implies_eq: "(A ==> B) == Trueprop(induct_implies(A, B))" |
403 |
406 |
404 lemmas induct_atomize = induct_forall_eq induct_implies_eq induct_equal_eq induct_conj_eq |
407 lemmas induct_atomize = induct_forall_eq induct_implies_eq induct_equal_eq induct_conj_eq |
405 lemmas induct_rulify [symmetric] = induct_atomize |
408 lemmas induct_rulify [symmetric] = induct_atomize |
406 lemmas induct_rulify_fallback = |
409 lemmas induct_rulify_fallback = |
407 induct_forall_def induct_implies_def induct_equal_def induct_conj_def |
410 induct_forall_def induct_implies_def induct_equal_def induct_conj_def |
408 |
|
409 hide_const induct_forall induct_implies induct_equal induct_conj |
|
410 |
|
411 |
411 |
412 text {* Method setup. *} |
412 text {* Method setup. *} |
413 |
413 |
414 ML_file "~~/src/Tools/induct.ML" |
414 ML_file "~~/src/Tools/induct.ML" |
415 ML {* |
415 ML {* |
425 ); |
425 ); |
426 *} |
426 *} |
427 |
427 |
428 declare case_split [cases type: o] |
428 declare case_split [cases type: o] |
429 |
429 |
|
430 end |
|
431 |
430 ML_file "~~/src/Tools/case_product.ML" |
432 ML_file "~~/src/Tools/case_product.ML" |
431 |
433 |
432 |
434 |
433 hide_const (open) eq |
435 hide_const (open) eq |
434 |
436 |