Theory Groups_mult

section ‹ Multiplication Groups ›

theory Groups_mult
  imports Main
begin

text ‹ The HOL standard library only has groups based on addition. Here, we build one based on
  multiplication. ›

notation times (infixl  70)

class group_mult = inverse + monoid_mult +
  assumes left_inverse: "inverse a  a = 1"
  assumes multi_inverse_conv_div [simp]: "a  (inverse b) = a / b"
begin

lemma div_conv_mult_inverse: "a / b = a  (inverse b)"
  by simp

sublocale mult: group times 1 inverse
  by standard (simp_all add: left_inverse)

lemma diff_self [simp]: "a / a = 1"
  using mult.right_inverse by auto

lemma mult_distrib_inverse [simp]: "(a * b) / b = a"
  by (metis local.mult_1_right local.multi_inverse_conv_div mult.right_inverse mult_assoc)

end

class ab_group_mult = comm_monoid_mult + group_mult
begin

lemma mult_distrib_inverse' [simp]: "(a * b) / a = b"
  using local.mult_distrib_inverse mult_commute by fastforce

lemma inverse_distrib: "inverse (a * b)  =  (inverse a) * (inverse b)"
  by (simp add: local.mult.inverse_distrib_swap mult_commute)

lemma inverse_divide [simp]: "inverse (a / b) = b / a"
  by (metis div_conv_mult_inverse inverse_distrib mult.commute mult.inverse_inverse)

end

abbreviation (input) npower :: "'a::{power,inverse}  nat  'a"  ((_-_) [1000,999] 999) 
  where "npower x n  inverse (x ^ n)"

end