Theory Einstein
theory Einstein
imports Complex_Main GyroGroup GyroVectorSpace GyroVectorSpaceIsomorphism GammaFactor HOL.Real_Vector_Spaces
MobiusGyroGroup MobiusGyroVectorSpace HOL.Transcendental
begin
text ‹Einstein zero›
definition ozero_e' :: "complex" where
"ozero_e' = 0"
lift_definition ozero_e :: PoincareDisc ("0⇩e") is ozero_e'
unfolding ozero_e'_def
by simp
lemma ozero_e_ozero_m:
shows "0⇩e = 0⇩m"
using ozero_e'_def ozero_e_def ozero_m'_def ozero_m_def
by auto
text ‹Einstein addition›
definition oplus_e' :: "complex ⇒ complex ⇒ complex" where
"oplus_e' u v = (1 / (1 + inner u v)) *⇩R (u + (1 / γ u) *⇩R v + ((γ u / (1 + γ u)) * (inner u v)) *⇩R u)"
lemma noroplus_m'_e:
assumes "norm u < 1" "norm v <1"
shows "norm (oplus_e' u v)^2 =
1 / (1 + inner u v)^2 * (norm(u+v)^2 - ((norm u)^2 *(norm v)^2 - (inner u v)^2))"
proof-
let ?uv = "inner u v"
let ?gu = "γ u / (1 + γ u)"
have 1: "norm (oplus_e' u v)^2 =
norm (1 / (1 + ?uv))^2 * norm ((u + ((1 / γ u) *⇩R v) + (?gu * ?uv) *⇩R u))^2"
by (metis oplus_e'_def norm_scaleR power_mult_distrib real_norm_def)
have 2: "norm (1 / (1 + ?uv))^2 = 1 / (1 + ?uv)^2"
by (simp add: power_one_over)
have "norm((u + ((1 / γ u) *⇩R v) + (?gu * ?uv) *⇩R u))^2 =
inner (u + (1 / γ u) *⇩R v + (?gu * ?uv) *⇩R u)
(u + (1 / γ u) *⇩R v + (?gu * ?uv) *⇩R u)"
by (simp add: dot_square_norm)
also have "… =
(norm u)^2 +
(norm ((1 / γ u) *⇩R v))^2 +
(norm ((?gu * ?uv) *⇩R u))^2 +
2 * inner u ((1 / γ u) *⇩R v) +
2 * inner u ((?gu * ?uv) *⇩R u) +
2 * inner ((?gu * ?uv) *⇩R u) ((1 / γ u) *⇩R v)" (is "?lhs = ?a + ?b + ?c + ?d + ?e + ?f")
by (smt (verit) inner_commute inner_right_distrib power2_norm_eq_inner)
also have "… = (norm u)^2 +
1 / (γ u)^2 * (norm v)^2 +
?gu^2 * (inner u v)^2 * (norm u)^2 +
2 / γ u * (inner u v) +
2 * ?gu * ?uv * (inner u u) +
2 * ?gu * ?uv * (1 / γ u) * (inner u v)"
proof-
have "?b = 1 / (γ u)^2 * (norm v)^2"
by (simp add: power_divide)
moreover
have "?c = ?gu^2 * (inner u v)^2 * (norm u)^2"
by (simp add: power2_eq_square)
moreover
have "?d = 2 / γ u * (inner u v)"
using inner_scaleR_right
by auto
moreover
have "?e = 2 * ?gu * ?uv * (inner u u)"
using inner_scaleR_right
by auto
moreover
have "?f = 2 * ?gu * ?uv * (1 / γ u) * (inner u v)"
by force
ultimately
show ?thesis
by presburger
qed
also have "… = 2 * inner u v + (inner u v)^2 + (norm u)^2 + (1 - (norm u)^2) * (norm v)^2" (is "?a + ?b + ?c + ?d + ?e + ?f = ?rhs")
proof-
have "?a + ?b = (norm u)^2 + (1 - (norm u)^2) * (norm v)^2"
using assms norm_square_gamma_factor
by force
moreover have "?d + ?e = 2 * inner u v" (is "?lhs = ?rhs")
proof-
have "?e = 2 * (γ u * (norm u)^2 / (1 + γ u)) * inner u v"
by (simp add: dot_square_norm)
moreover
have "1 / γ u + γ u * (norm u)^2 / (1 + γ u) = 1"
using assms(1) gamma_expression_eq_one_1
by blast
moreover
have "?d + 2 * (γ u * (norm u)^2 / (1 + γ u)) * inner u v = 2 * inner u v * (1 / γ u + γ u * (norm u)^2 / (1 + γ u))"
by (simp add: distrib_left)
ultimately
show ?thesis
by (metis mult.right_neutral)
qed
moreover
have "?c + ?f = (inner u v)^2"
proof-
have "?c + ?f = ?gu^2 * (norm u)^2 * (inner u v)^2 + 2 * (1 / γ u) * ?gu * (inner u v)^2"
by (simp add: mult.commute mult.left_commute power2_eq_square)
then have "?c + ?f = ((γ u / (1 + γ u))^2 * (norm u)^2 + 2 * (1 / γ u) * (γ u / (1 + γ u))) * (inner u v)^2"
by (simp add: ring_class.ring_distribs(2))
moreover
have "(γ u / (1 + γ u))^2 * (norm u)^2 + 2 * (1 / γ u) * (γ u / (1 + γ u)) = 1"
proof -
have "∀ (x::real) y n. (x / y) ^ n = x ^ n / y ^ n"
by (simp add: power_divide)
then show ?thesis
using gamma_expression_eq_one_2[OF assms(1)]
by fastforce
qed
ultimately
show ?thesis
by simp
qed
ultimately
show ?thesis
by auto
qed
also have "… = ((cmod (u + v))⇧2 - ((cmod u)⇧2 * (cmod v)⇧2 - ?uv⇧2))"
unfolding dot_square_norm[symmetric]
by (simp add: inner_commute inner_right_distrib field_simps)
finally
have 3: "norm ((u + ((1 / γ u) *⇩R v) + (?gu * ?uv) *⇩R u))^2 =
norm(u+v)^2 - ((norm u)^2 *(norm v)^2 - ?uv^2)"
by simp
show ?thesis
using 1 2 3
by simp
qed
lemma gamma_oplus_e':
assumes "norm u < 1" "norm v < 1"
shows "1 / sqrt(1 - norm (oplus_e' u v)^2) = γ u * γ v * (1 + inner u v)"
proof-
let ?uv = "inner u v"
have abs: "abs (1 + ?uv) = 1 + ?uv"
using abs_inner_lt_1 assms by fastforce
have "1 - norm (oplus_e' u v)^2 =
1 - 1 / (1 + ?uv)^2 * (norm(u+v)^2 - ((norm u)^2 *(norm v)^2 - ?uv^2))"
using assms noroplus_m'_e
by presburger
also have "… = ((1 + ?uv)^2 - (norm(u+v)^2 - ((norm u)^2 *(norm v)^2 - ?uv^2))) /
(1 + ?uv)^2"
proof-
have "?uv ≠ -1"
using abs_inner_lt_1[OF assms]
by auto
then have "(1 + ?uv)^2 ≠ 0"
by auto
then show ?thesis
by (simp add: diff_divide_distrib)
qed
also have "… = (1 - (norm u)^2 - (norm v)^2 + (norm u)^2 * (norm v)^2) / (1 + ?uv)^2"
proof-
have "(1 + ?uv)^2 = 1 + 2*?uv + ?uv^2"
by (simp add: power2_eq_square field_simps)
moreover
have "norm(u+v)^2 - ((norm u)^2 *(norm v)^2 - ?uv^2) =
(norm u)^2 + 2*?uv + (norm v)^2 - (norm u)^2*(norm v)^2 + ?uv^2"
by (smt (z3) dot_norm field_sum_of_halves)
ultimately
show ?thesis
by auto
qed
finally have "1 / sqrt (1 - norm (oplus_e' u v)^2) =
1 / sqrt((1 - (norm u)^2 - (norm v)^2 + (norm u)^2*(norm v)^2) / (1 + ?uv)^2)"
by simp
then have 1: "1 / sqrt (1 - norm (oplus_e' u v)^2) =
(1 + ?uv) / sqrt (1 - (norm u)^2 - (norm v)^2 + (norm u)^2*(norm v)^2)"
using abs
by (simp add: real_sqrt_divide)
have "γ u = 1 / sqrt(1 - (norm u)^2)" "γ v = 1 / sqrt(1 - (norm v)^2)"
using assms
by (metis gamma_factor_def)+
then have "γ u * γ v = (1 / sqrt (1 - (norm u)^2)) * (1 / sqrt (1 - (norm v)^2))"
by simp
also have "… = 1 / sqrt ((1 - (norm u)^2) * (1 - (norm v)^2))"
by (simp add: real_sqrt_mult)
finally have 2: "γ u * γ v = 1 / sqrt ((1 - (norm u)^2 - (norm v)^2 + (norm u)^2*(norm v)^2))"
by (simp add: field_simps power2_eq_square)
show ?thesis
using 1 2
by (metis (no_types, lifting) mult_cancel_right1 times_divide_eq_left)
qed
lemma gamma_oplus_e'_not_zero:
assumes "norm u < 1" "norm v < 1"
shows "1 / sqrt(1 - norm(oplus_e' u v)^2) ≠ 0"
using assms
using gamma_oplus_e' gamma_factor_def gamma_factor_nonzero noroplus_m'_e
by (smt (verit, del_insts) divide_eq_0_iff mult_eq_0_iff zero_eq_power2)
lemma oplus_e'_in_unit_disc:
assumes "norm u < 1" "norm v < 1"
shows "norm (oplus_e' u v) < 1"
proof-
let ?uv = "inner u v"
have "1 + ?uv > 0"
using abs_inner_lt_1[OF assms]
by fastforce
then have "γ u * γ v * (1 + inner u v) > 0"
using gamma_factor_positive[OF assms(1)]
gamma_factor_positive[OF assms(2)]
by fastforce
then have "0 < sqrt (1 - (cmod (oplus_e' u v))⇧2)"
using gamma_oplus_e'[OF assms] gamma_oplus_e'_not_zero[OF assms]
by (metis zero_less_divide_1_iff)
then have "(norm (oplus_e' u v))^2 < 1"
using real_sqrt_gt_0_iff
by simp
then show ?thesis
using real_less_rsqrt by force
qed
lemma gamma_factor_oplus_e':
assumes "norm u < 1" "norm v < 1"
shows "γ (oplus_e' u v) = (γ u) * (γ v) * (1 + inner u v)"
proof-
have "γ (oplus_e' u v) = 1 / sqrt(1 - norm (oplus_e' u v)^2)"
by (simp add: assms(1) assms(2) oplus_e'_in_unit_disc gamma_factor_def)
then show ?thesis
using assms
using gamma_oplus_e' by force
qed
lift_definition oplus_e :: "PoincareDisc ⇒ PoincareDisc ⇒ PoincareDisc" (infixl "⊕⇩e" 100) is oplus_e'
by (rule oplus_e'_in_unit_disc)
definition ominus_e' :: "complex ⇒ complex" where
"ominus_e' v = - v"
lemma ominus_e'_in_unit_disc:
assumes "norm z < 1"
shows "norm (ominus_e' z) < 1"
using assms
unfolding ominus_e'_def
by simp
lift_definition ominus_e :: "PoincareDisc ⇒ PoincareDisc" ("⊖⇩e") is ominus_e'
using ominus_e'_in_unit_disc by blast
lemma ominus_e_ominus_m:
shows "⊖⇩e a = ⊖⇩m a"
by (simp add: ominus_e'_def ominus_e_def ominus_m'_def ominus_m_def)
lemma ominus_e_scale:
shows "k ⊗ (⊖⇩e u) = ⊖⇩e (k ⊗ u)"
using ominus_e_ominus_m ominus_m_scale by auto
lemma gamma_factor_p_positive:
shows "γ⇩p a > 0"
by transfer (simp add: gamma_factor_positive)
lemma gamma_factor_p_oplus_e:
shows "γ⇩p (u ⊕⇩e v) = γ⇩p u * γ⇩p v * (1 + u ⋅ v)"
using gamma_factor_oplus_e'
by transfer blast
abbreviation γ⇩2 :: "complex ⇒ real" where
"γ⇩2 u ≡ γ u / (1 + γ u)"
lemma norm_square_gamma_half_scale:
assumes "norm u < 1"
shows "(norm (γ⇩2 u *⇩R u))⇧2 = (γ u - 1) / (1 + γ u)"
proof-
have "(norm (γ⇩2 u *⇩R u))⇧2 = (γ⇩2 u)⇧2 * (norm u)⇧2"
by (simp add: power2_eq_square)
also have "… = (γ⇩2 u)⇧2 * ((γ u)⇧2 - 1) / (γ u)⇧2"
using assms
by (simp add: norm_square_gamma_factor')
also have "… = (γ u)⇧2 / (1 + γ u)⇧2 * ((γ u)⇧2 - 1) / (γ u)⇧2"
by (simp add: power_divide)
also have "… = ((γ u)⇧2 - 1) / (1 + γ u)⇧2"
using assms gamma_factor_positive
by fastforce
also have "… = (γ u - 1) * (γ u + 1) / (1 + γ u)⇧2"
by (simp add: power2_eq_square square_diff_one_factored)
also have "… = (γ u - 1) / (1 + γ u)"
by (simp add: add.commute power2_eq_square)
finally
show ?thesis
by simp
qed
lemma norm_half_square_gamma:
assumes "norm u < 1"
shows "(norm (half' u))⇧2 = (γ⇩2 u)⇧2 * (cmod u)⇧2"
unfolding half'_def
using norm_square_gamma_half_scale assms
by (smt (verit) divide_pos_pos gamma_factor_positive norm_scaleR power_mult_distrib)
lemma norm_half_square_gamma':
assumes "cmod u < 1"
shows "(norm (half' u))⇧2 = (γ u - 1) / (1 + γ u)"
using assms
using half'_def norm_square_gamma_half_scale
by auto
lemma inner_half_square_gamma:
assumes "cmod u < 1" "cmod v < 1"
shows "inner (half' u) (half' v) = γ⇩2 u * γ⇩2 v * inner u v"
unfolding half'_def scaleR_conv_of_real
by (metis inner_mult_left inner_mult_right mult.assoc)
lemma iso_me_help1:
assumes "norm v < 1"
shows "1 + (γ v - 1) / (1 + γ v) = 2 * γ v / (1 + γ v)"
proof-
have "1 + γ v ≠ 0"
using assms gamma_factor_positive
by fastforce
then show ?thesis
by (smt (verit, del_insts) diff_divide_distrib divide_self)
qed
lemma iso_me_help2:
assumes "norm v < 1"
shows "1 - (γ v - 1) / (1 + γ v) = 2 / (1 + γ v)"
proof-
have "1 + γ v ≠ 0"
using assms gamma_factor_positive
by fastforce
then show ?thesis
by (smt (verit, del_insts) diff_divide_distrib divide_self)
qed
lemma iso_me_help3:
assumes "norm v < 1" "norm u <1"
shows "1 + ((γ v - 1) / (1 + γ v)) * ((γ u - 1) / (1 + γ u)) =
2 * (1 + (γ u) * (γ v)) / ((1 + γ v) * (1 + γ u))" (is "?lhs = ?rhs")
proof-
have *: "1 + γ v ≠ 0" "1 + γ u ≠ 0"
using assms gamma_factor_positive by fastforce+
have "(1 + γ v) * (1 + γ u) = 1 + (γ v) + (γ u) + (γ u)*(γ v)"
by (simp add: field_simps)
moreover
have "(γ v - 1) * (γ u - 1) = (γ u)*(γ v) - (γ u) - (γ v) +1"
by (simp add: field_simps)
moreover
have "?lhs = ((1 + γ v) * (1 + γ u) + (γ u - 1) * (γ v - 1)) / ((1 + γ v) * (1 + γ u))"
using *
by (simp add: add_divide_distrib)
ultimately show ?thesis
by (simp add: mult.commute)
qed
lemma half'_oplus_e':
fixes u v :: complex
assumes "cmod u < 1" "cmod v < 1"
shows "half' (oplus_e' u v) =
γ u * γ v / (γ u * γ v * (1 + inner u v) + 1) * (u + (1 / γ u) * v + (γ u / (1 + γ u)) * inner u v * u)"
proof-
have "half' (oplus_e' u v) =
γ u * γ v * (1 + inner u v) / (γ u * γ v * (1 + inner u v) + 1) *
((1 / (1 + inner u v)) * (u + (1 / γ u)*v + (γ u / (1 + γ u)) * inner u v * u))"
unfolding half'_def
unfolding gamma_factor_oplus_e'[OF assms] scaleR_conv_of_real
unfolding oplus_e'_def scaleR_conv_of_real
by simp
then show ?thesis
using assms
by (smt (verit, best) ab_semigroup_mult_class.mult_ac(1) gamma_oplus_e' gamma_oplus_e'_not_zero inner_mult_left' inner_real_def mult.commute mult_eq_0_iff nonzero_mult_divide_mult_cancel_right2 of_real_1 of_real_divide of_real_mult real_inner_1_right times_divide_times_eq)
qed
lemma oplus_m'_half':
fixes u v :: complex
assumes "cmod u < 1" "cmod v < 1"
shows "oplus_m' (half' u) (half' v) =
(γ u * γ v / (γ u * γ v * (1 + inner u v) + 1)) *
(u + (1 / γ u) * v + (γ u / (1 + γ u) * inner u v) * u)"
proof-
have *: "γ u ≠ 0" "γ v ≠ 0" "1 + γ u ≠ 0" "1 + γ v ≠ 0"
using assms gamma_factor_positive
by fastforce+
let ?den = "(1 + γ v) * (1 + γ u)"
let ?DEN = "γ u * γ v * (1 + inner u v) + 1"
let ?NOM = "u + (1 / γ u) * v + (γ u / (1 + γ u) * inner u v) * u"
have **: "cmod (half' u) < 1" "cmod (half' v) < 1"
using assms
by (metis eq_onp_same_args half.rsp rel_fun_eq_onp_rel)+
then have "oplus_m' (half' u) (half' v) = oplus_m'_alternative (half' u) (half' v)"
by (simp add: oplus_m'_alternative)
also have "… = ((2 * γ⇩2 v + 2 * γ⇩2 v * γ⇩2 u * inner u v) * γ⇩2 u * u + 2 * γ v / ?den * v) /
(2 * γ u * γ v * inner u v / ?den + 2 * (1 + γ u * γ v) / ?den)"
proof-
have "(1 + 2 * inner (half' u) (half' v) + (norm (half' v))⇧2) *⇩R (half' u) =
(2 * γ⇩2 v + 2 * γ v * γ u / ?den * inner u v) * γ⇩2 u * u"
proof-
have *: "half' u = (γ u / (1 + γ u)) * u"
by (simp add: half'_def scaleR_conv_of_real)
have "1 + 2 * inner (half' u) (half' v) + (cmod (half' v))⇧2 =
1 + 2 * (γ⇩2 u * γ⇩2 v * inner u v) + (γ⇩2 v)⇧2 * (cmod v)⇧2"
using inner_half_square_gamma norm_half_square_gamma assms
by simp
also have "… = 2 * γ v / (1 + γ v) + 2 * γ v * γ u / ?den * inner u v"
using assms norm_half_square_gamma norm_square_gamma_half_scale[OF assms(2)] iso_me_help1[OF assms(2)] half'_def
by (smt (verit, best) add_divide_distrib distrib_left inner_commute inner_left_distrib inner_real_def times_divide_times_eq)
finally
show ?thesis
using *
by (simp add: of_real_def)
qed
moreover
have "(1 - (norm (half' u))⇧2) *⇩R (half' v) =
( 2 * (γ v) / ?den) * v"
proof-
have "(norm (half' u))⇧2 = (γ u - 1) / (1 + γ u) "
using assms(1) norm_half_square_gamma' by blast
moreover have "1 - (γ u - 1) / (1 + γ u) = 2/ (1 + γ u)"
using assms(1) iso_me_help2 by blast
ultimately show ?thesis
by (simp add: half'_def mult.commute scaleR_conv_of_real)
qed
moreover
have"1 + 2 * inner (half' u) (half' v) + (cmod (half' u))⇧2 * (cmod (half' v))⇧2 =
2 * γ u * γ v * inner u v / ?den + 2 * (1 + γ u * γ v) / ?den"
using assms inner_half_square_gamma iso_me_help3 norm_half_square_gamma'
by (simp add: field_simps)
ultimately
show ?thesis
unfolding oplus_m'_alternative_def
by (simp add: mult.commute)
qed
also have "… = (2 * γ v * γ u * u + 2 * γ v * γ u * inner u v * γ⇩2 u * u + 2 * γ v * v) /
(2 * γ u * γ v * inner u v + (2 + 2 * γ u * γ v))"
proof-
have "1 / ?den ≠ 0"
using *
by simp
moreover
have "(2 * γ⇩2 v + 2 * γ⇩2 v * γ⇩2 u * inner u v) * γ⇩2 u * u + 2 * γ v / ?den * v =
(1 / ?den) * (2 * γ v * γ u * u + 2 * γ v * γ u * inner u v * γ⇩2 u * u + 2 * γ v * v)"
by (simp add: mult.commute ring_class.ring_distribs(1))
moreover
have "2 * γ u * γ v * inner u v / ?den + 2 * (1 + γ u * γ v) / ?den =
(1 / ?den) * (2 * γ u * γ v * inner u v + (2 + 2 * γ u * γ v))"
by argo
ultimately
show ?thesis
by (smt (verit, ccfv_threshold) divide_divide_eq_left' division_ring_divide_zero eq_divide_eq inner_commute inner_real_def mult_eq_0_iff mult_eq_0_iff nonzero_mult_divide_mult_cancel_left nonzero_mult_divide_mult_cancel_left numeral_One of_real_1 of_real_1 of_real_divide of_real_inner_1 of_real_mult one_divide_eq_0_iff real_inner_1_right times_divide_times_eq)
qed
also have "… = 2 * (γ v * γ u * u + γ v * γ u * inner u v * γ u / (1 + γ u) * u + γ v * v) / (2 * ?DEN)"
by (simp add: field_simps)
also have "… = (γ v * γ u * u + γ v * γ u * inner u v * γ u / (1 + γ u) * u + γ v * v) / ?DEN"
by (metis (no_types, opaque_lifting) nonzero_mult_divide_mult_cancel_left of_real_mult of_real_numeral zero_neq_numeral)
also have "… = ((γ v * γ u) * u + (γ v * γ u) * (inner u v * γ u / (1 + γ u) * u) + (γ u * γ v) * (v / γ u)) / ?DEN"
using ‹γ u ≠ 0›
by simp
also have "… = (γ v * γ u) * ?NOM / ?DEN"
proof-
have "(γ v * γ u) * u + (γ v * γ u) * (inner u v * γ u / (1 + γ u) * u) + (γ u * γ v) * (v / γ u) = (γ v * γ u) * ?NOM"
by (simp add: field_simps)
then show ?thesis
by simp
qed
finally show ?thesis
by simp
qed
lemma iso_me_oplus:
shows "(1/2) ⊗ (u ⊕⇩e v) = ((1/2) ⊗ u) ⊕⇩m ((1/2) ⊗ v)"
proof transfer
fix u v
assume *: "cmod u < 1" "cmod v < 1"
have "otimes' (1 / 2) (oplus_e' u v) = half' (oplus_e' u v)"
using half'[of "oplus_e' u v"] *
unfolding otimes'_def
using oplus_e'_in_unit_disc
by blast
moreover
have "otimes' (1 / 2) u = half' u" "otimes' (1 / 2) v = half' v"
using half' *
by auto
moreover
have "half' (oplus_e' u v) = oplus_m' (half' u) (half' v)"
using * half'_oplus_e'[OF *] oplus_m'_half'[OF *]
by simp
ultimately
show "otimes' (1 / 2) (oplus_e' u v) = oplus_m' (otimes' (1 / 2) u) (otimes' (1 / 2) v)"
by simp
qed
lemma oplus_e_oplus_m:
shows "u ⊕⇩e v = 2 ⊗ ((1/2) ⊗ u ⊕⇩m (1/2) ⊗ v)"
by (metis half iso_me_oplus otimes_2_half)
lemma iso_two_me_oplus:
shows "2 ⊗ (u ⊕⇩m v) = (2 ⊗ u) ⊕⇩e (2 ⊗ v)"
by (metis Mobius_pre_gyrovector_space.double_half iso_me_oplus otimes_2_oplus_m)
lemma iso_two_me_ominus:
shows "2 ⊗ (⊖⇩m u) = ⊖⇩e (2 ⊗ u)"
using ominus_e_ominus_m ominus_e_scale by auto
lemma iso_two_me_zero:
shows "2 ⊗ 0⇩m = 0⇩e"
using Mobius_pre_gyrovector_space.times_zero gyrozero_PoincareDisc_def ozero_e_ozero_m
by fastforce
lemma iso_two_me_bij:
shows "bij (λ x::PoincareDisc. 2 ⊗ x)"
by (metis Mobius_pre_gyrovector_space.equation_solving bijI' half otimes_2_half)
definition gyr⇩e::"PoincareDisc ⇒ PoincareDisc ⇒ PoincareDisc ⇒ PoincareDisc" where
"gyr⇩e u v w = ⊖⇩e (u ⊕⇩e v) ⊕⇩e (u ⊕⇩e (v ⊕⇩e w))"
typedef PoincareDiscM = "UNIV::PoincareDisc set"
by auto
setup_lifting type_definition_PoincareDiscM
lift_definition zero_M :: "PoincareDiscM" ("0⇩M") is "0⇩m" .
lift_definition ominus_M :: "PoincareDiscM ⇒ PoincareDiscM" ("⊖⇩M") is "(⊖⇩m)" .
lift_definition oplus_M :: "PoincareDiscM ⇒ PoincareDiscM ⇒ PoincareDiscM" (infixl "⊕⇩M" 100) is "(⊕⇩m)" .
lift_definition gyr_M :: "PoincareDiscM ⇒ PoincareDiscM ⇒ PoincareDiscM ⇒ PoincareDiscM" is "gyr⇩m" .
lift_definition to_complex_M :: "PoincareDiscM ⇒ complex" is to_complex .
interpretation gyrogroupoid_M: gyrogroupoid zero_M oplus_M .
instantiation PoincareDiscM :: gyrogroupoid
begin
definition gyrozero_PoincareDiscM where "gyrozero_PoincareDiscM = 0⇩M"
definition gyroplus_PoincareDiscM where "gyroplus_PoincareDiscM = oplus_M"
instance
..
end
instantiation PoincareDiscM :: gyrocommutative_gyrogroup
begin
definition gyroinv_PoincareDiscM where "gyroinv_PoincareDiscM = ominus_M"
definition gyr_PoincareDiscM where "gyr_PoincareDiscM = gyr_M"
instance proof
fix a :: PoincareDiscM
show "0⇩g ⊕ a = a"
unfolding gyrozero_PoincareDiscM_def gyroplus_PoincareDiscM_def
by transfer auto
next
fix a :: PoincareDiscM
show "⊖ a ⊕ a = 0⇩g"
unfolding gyrozero_PoincareDiscM_def gyroplus_PoincareDiscM_def gyroinv_PoincareDiscM_def
by transfer auto
next
fix a b z :: PoincareDiscM
show "a ⊕ (b ⊕ z) = a ⊕ b ⊕ gyr a b z"
unfolding gyroplus_PoincareDiscM_def gyr_PoincareDiscM_def
by transfer (simp add: gyr_m_left_assoc)
next
fix a b :: PoincareDiscM
show "gyr a b = gyr (a ⊕ b) b"
unfolding gyroplus_PoincareDiscM_def gyr_PoincareDiscM_def
using gyr_m_left_loop
by transfer auto
next
fix a b :: PoincareDiscM
show "gyroaut (gyr a b)"
unfolding gyroplus_PoincareDiscM_def gyr_PoincareDiscM_def gyroaut_def bij_def inj_def surj_def
by transfer (metis gyr_m_distrib gyr_m_inv)
next
fix a b :: PoincareDiscM
show "a ⊕ b = gyr a b (b ⊕ a)"
unfolding gyroplus_PoincareDiscM_def gyr_PoincareDiscM_def
by transfer (metis gyr_m_commute)
qed
end
typedef PoincareDiscE = "UNIV::PoincareDisc set"
by auto
setup_lifting type_definition_PoincareDiscE
lift_definition zero_E :: "PoincareDiscE" ("0⇩E") is "0⇩e" .
lift_definition ominus_E :: "PoincareDiscE ⇒ PoincareDiscE" ("⊖⇩E") is "(⊖⇩e)" .
lift_definition oplus_E :: "PoincareDiscE ⇒ PoincareDiscE ⇒ PoincareDiscE" (infixl "⊕⇩E" 100) is "(⊕⇩e)" .
lift_definition gyr_E :: "PoincareDiscE ⇒ PoincareDiscE ⇒ PoincareDiscE ⇒ PoincareDiscE" is "gyr⇩e" .
lift_definition to_complex_E :: "PoincareDiscE ⇒ complex" is to_complex .
lift_definition φ⇩M⇩E :: "PoincareDiscM ⇒ PoincareDiscE" is "λ x::PoincareDisc. 2 ⊗ x" .