src/HOL/HOL.thy
changeset 11824 f4c1882dde2c
parent 11770 b6bb7a853dd2
child 11953 f98623fdf6ef
equal deleted inserted replaced
11823:5a3fcd84e55e 11824:f4c1882dde2c
   251 setup Simplifier.setup
   251 setup Simplifier.setup
   252 setup "Simplifier.method_setup Splitter.split_modifiers" setup simpsetup
   252 setup "Simplifier.method_setup Splitter.split_modifiers" setup simpsetup
   253 setup Splitter.setup setup Clasimp.setup
   253 setup Splitter.setup setup Clasimp.setup
   254 
   254 
   255 
   255 
       
   256 subsubsection {* Generic cases and induction *}
       
   257 
       
   258 constdefs
       
   259   inductive_forall :: "('a => bool) => bool"
       
   260   "inductive_forall P == \<forall>x. P x"
       
   261   inductive_implies :: "bool => bool => bool"
       
   262   "inductive_implies A B == A --> B"
       
   263   inductive_equal :: "'a => 'a => bool"
       
   264   "inductive_equal x y == x = y"
       
   265   inductive_conj :: "bool => bool => bool"
       
   266   "inductive_conj A B == A & B"
       
   267 
       
   268 lemma inductive_forall_eq: "(!!x. P x) == Trueprop (inductive_forall (\<lambda>x. P x))"
       
   269   by (simp only: atomize_all inductive_forall_def)
       
   270 
       
   271 lemma inductive_implies_eq: "(A ==> B) == Trueprop (inductive_implies A B)"
       
   272   by (simp only: atomize_imp inductive_implies_def)
       
   273 
       
   274 lemma inductive_equal_eq: "(x == y) == Trueprop (inductive_equal x y)"
       
   275   by (simp only: atomize_eq inductive_equal_def)
       
   276 
       
   277 lemma inductive_forall_conj: "inductive_forall (\<lambda>x. inductive_conj (A x) (B x)) =
       
   278     inductive_conj (inductive_forall A) (inductive_forall B)"
       
   279   by (unfold inductive_forall_def inductive_conj_def) blast
       
   280 
       
   281 lemma inductive_implies_conj: "inductive_implies C (inductive_conj A B) =
       
   282     inductive_conj (inductive_implies C A) (inductive_implies C B)"
       
   283   by (unfold inductive_implies_def inductive_conj_def) blast
       
   284 
       
   285 lemma inductive_conj_curry: "(inductive_conj A B ==> C) == (A ==> B ==> C)"
       
   286   by (simp only: atomize_imp atomize_eq inductive_conj_def) (rule equal_intr_rule, blast+)
       
   287 
       
   288 lemmas inductive_atomize = inductive_forall_eq inductive_implies_eq inductive_equal_eq
       
   289 lemmas inductive_rulify1 = inductive_atomize [symmetric, standard]
       
   290 lemmas inductive_rulify2 =
       
   291   inductive_forall_def inductive_implies_def inductive_equal_def inductive_conj_def
       
   292 lemmas inductive_conj = inductive_forall_conj inductive_implies_conj inductive_conj_curry
       
   293 
       
   294 hide const inductive_forall inductive_implies inductive_equal inductive_conj
       
   295 
       
   296 
       
   297 text {* Method setup. *}
       
   298 
       
   299 ML {*
       
   300   structure InductMethod = InductMethodFun
       
   301   (struct
       
   302     val dest_concls = HOLogic.dest_concls;
       
   303     val cases_default = thm "case_split";
       
   304     val conjI = thm "conjI";
       
   305     val atomize = thms "inductive_atomize";
       
   306     val rulify1 = thms "inductive_rulify1";
       
   307     val rulify2 = thms "inductive_rulify2";
       
   308   end);
       
   309 *}
       
   310 
       
   311 setup InductMethod.setup
       
   312 
       
   313 
   256 subsection {* Order signatures and orders *}
   314 subsection {* Order signatures and orders *}
   257 
   315 
   258 axclass
   316 axclass
   259   ord < "term"
   317   ord < "term"
   260 
   318