theory Demo3 = Main: section {* Example 1 *} locale semi = fixes prod :: "['a, 'a] => 'a" (infixl "\" 70) assumes assoc: "(x \ y) \ z = x \ (y \ z)" locale group = semi + fixes one and inv assumes l_one: "one \ x = x" and r_one: "x \ one = x" and l_inv: "inv x \ x = one" and r_inv: "x \ inv x = one" lemma (in group) l_cancel: "(x \ y = x \ z) = (y = z)" proof assume "x \ y = x \ z" then have "(inv x \ x) \ y = (inv x \ x) \ z" by (simp add: assoc) then show "y = z" by (simp add: l_one l_inv) next assume "y = z" then show "x \ y = x \ z" by simp qed subsection {* Export *} thm semi.assoc group.l_cancel subsection {* Definitions *} locale semi2 = semi + fixes rprod (infixl "\" 70) defines rprod_def: "rprod x y \ y \ x " lemma (in semi2) r_assoc: "(x \ y) \ z = x \ (y \ z)" by (simp only: rprod_def assoc) thm semi2.r_assoc section {* Example 2 *} locale group_hom = group sum zero minus + group + fixes hom assumes hom_mult: "hom (sum x y) = hom x \ hom y" lemma (in group_hom) hom_one: "hom zero = one" proof - have "hom zero \ one = hom zero \ hom zero" by (simp add: hom_mult [symmetric] sum_zero_minus.l_one prod_one_inv.r_one) -- {* Or add @{text l_one} to simpset right away. *} then show ?thesis by (simp add: l_cancel) qed section {* Example 3 *} lemma int_semi: "semi (op +::[int, int]=>int)" by (auto intro!: semi.intro) lemma int_group: "group (op +) (0::int) uminus" by (auto intro!: group.intro semi.intro group_axioms.intro) text {* Manual instantiation possible with the OF attribute. *} thm semi.assoc [OF int_semi] thm group.l_cancel [OF int_group] text {* Automatic instantiation *} lemma bla: True proof - from int_group instantiate my: group thm my.assoc my.l_cancel oops end