src/HOL/HOL.thy
changeset 11989 d4bcba4e080e
parent 11977 2e7c54b86763
child 12003 c09427e5f554
equal deleted inserted replaced
11988:8340fb172607 11989:d4bcba4e080e
   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