theory BI imports WordMain begin consts MIN :: "'a :: bit" MAX :: "'a :: bit" arities "fun" :: (type, bit) bit axclass boolean_class < bit boolean_thm : "boolean bitAND bitOR bitNOT MIN MAX" types 'a binop = "['a, 'a] => 'a" defs (overloaded) fun_AND_def : "bitAND == %f g a. (f a AND g a :: 'b :: bit)" fun_OR_def : "bitOR == %f g a. (f a OR g a :: 'b :: bit)" fun_NOT_def : "bitNOT == %g a. (NOT g a :: 'b :: bit)" fun_MIN_def : "MIN == %a. (MIN :: 'b :: bit)" fun_MAX_def : "MAX == %a. (MAX :: 'b :: bit)" lemmas boolexp = boolean_thm [unfolded boolean_def] ; ML {* val boolexp = thm "boolexp" ; val bool_axioms = Seq.list_of (EVERY' [REPEAT o dresolve_tac [conjunct1, conjunct2], REPEAT o etac allE, atac] 1 (boolexp RS revcut_rl)) ; val _ = bind_thms ("bool_axioms", bool_axioms) ; *} lemmas AND_MAX = bool_axioms (7) ; lemmas OR_MIN = bool_axioms (8) ; lemma fun_boolean: "boolean bitAND bitOR bitNOT MIN (MAX :: 'a => 'b :: boolean_class)" apply (unfold fun_AND_def fun_OR_def fun_NOT_def fun_MIN_def fun_MAX_def boolean_def) ; apply safe ; apply (rule_tac ext bool_axioms)+ ; done ; instance "fun" :: (type, boolean_class) boolean_class apply intro_classes ; apply (rule_tac fun_boolean) ; done ; (* application to sets *) instance bool :: bit .. defs (overloaded) bool_NOT_def: "bitNOT == Not" bool_AND_def: "bitAND == op &" bool_OR_def: "bitOR == op |" bool_MIN_def: "MIN == False" bool_MAX_def: "MAX == True" bool_XOR_def: "bitXOR == (%x y. x ~= y)" instance bool :: boolean_class apply intro_classes ; apply (unfold bool_AND_def bool_OR_def bool_NOT_def bool_MIN_def bool_MAX_def boolean_def) ; by auto ; (* application to sets *) instance set :: (type) bit .. defs (overloaded) set_AND_def : "bitAND == %S T. Collect ((%x. x : S) AND (%x. x : T))" set_OR_def : "bitOR == %S T. Collect ((%x. x : S) OR (%x. x : T))" set_NOT_def : "bitNOT == %S. Collect (NOT (%x. x : S))" set_MIN_def : "MIN == Collect MIN" set_MAX_def : "MAX == Collect MAX" lemma set_boolean: "boolean bitAND bitOR bitNOT MIN (MAX :: 'a set)" apply (unfold set_AND_def set_OR_def set_NOT_def set_MIN_def set_MAX_def boolean_def) ; apply (tactic "REPEAT_ALL_NEW (rtac conjI) 1") ; apply (tactic "REPEAT_FIRST (rtac allI)") ; apply (simp_all only : mem_Collect_eq) ; apply (tactic "TRYALL (rtac Collect_cong)") ; ML {* val bffcs0 = bool_axioms RL [fun_cong] *} (* [] - why *) ML {* val tt0 = theory_of_thm (hd bool_axioms) *} ML {* val bffcs1 = thms "bool_axioms" RL [fun_cong] *} ML {* val bffcs2 = @{thms bool_axioms} RL [fun_cong] *} ML {* val bffcs3 = map (transfer (the_context())) bool_axioms RL [fun_cong] *} apply (tactic "TRYALL (resolve_tac bffcs1)") ; apply (simp_all add : AND_MAX OR_MIN) ; done ; instance set :: (type) boolean_class apply intro_classes ; apply (rule_tac set_boolean) ; done ; end (* bool_axioms RL [fun_cong] ; Isar.loop() ; oops ; end ; theory x imports BI begin *)