Skip to content

Commit 1b82919

Browse files
committed
chore(UpperHalfPlane): redefine as a structure (leanprover-community#34597)
Make `UpperHalfPlane` into a two-field structure rather than a type alias for a subtype, to reduce defeq abuse.
1 parent 58f4dfc commit 1b82919

21 files changed

Lines changed: 179 additions & 141 deletions

File tree

Mathlib/Analysis/Complex/IntegerCompl.lean

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,29 @@ local notation "ℂ_ℤ" => integerComplement
2828

2929
lemma integerComplement_eq : ℂ_ℤ = {z : ℂ | ¬ ∃ (n : ℤ), n = z} := rfl
3030

31-
lemma integerComplement.mem_iff {x : ℂ} : x ∈ ℂ_ℤ ↔ ¬ ∃ (n : ℤ), n = x := Iff.rfl
31+
lemma mem_integerComplement_iff {x : ℂ} : x ∈ ℂ_ℤ ↔ ¬ ∃ (n : ℤ), n = x := Iff.rfl
3232

33+
@[deprecated (since := "2026-01-29")]
34+
alias integerComplement.mem_iff := mem_integerComplement_iff
35+
36+
@[simp]
3337
lemma _root_.UpperHalfPlane.coe_mem_integerComplement (z : ℍ) : ↑z ∈ ℂ_ℤ :=
34-
not_exists.mpr fun x hx ↦ ne_int z x hx.symm
38+
not_exists.mpr fun x hx ↦ ne_intCast z x hx.symm
3539

36-
lemma integerComplement.add_coe_int_mem {x : ℂ} (a : ℤ) : x + (a : ℂ) ∈ ℂ_ℤ ↔ x ∈ ℂ_ℤ := by
37-
simp only [mem_iff, not_iff_not]
40+
@[simp]
41+
lemma add_intCast_mem_integerComplement {x : ℂ} (a : ℤ) : x + (a : ℂ) ∈ ℂ_ℤ ↔ x ∈ ℂ_ℤ := by
42+
simp only [mem_integerComplement_iff, not_iff_not]
3843
exact ⟨(Exists.elim · fun n hn ↦ ⟨n - a, by simp [hn]⟩),
3944
(Exists.elim · fun n hn ↦ ⟨n + a, by simp [hn]⟩)⟩
4045

46+
@[deprecated (since := "2026-01-29")]
47+
alias integerComplement.add_coe_int_mem := add_intCast_mem_integerComplement
48+
4149
lemma integerComplement.ne_zero {x : ℂ} (hx : x ∈ ℂ_ℤ) : x ≠ 0 :=
4250
fun hx' ↦ hx ⟨0, by exact_mod_cast hx'.symm⟩
4351

4452
lemma integerComplement_add_ne_zero {x : ℂ} (hx : x ∈ ℂ_ℤ) (a : ℤ) : x + (a : ℂ) ≠ 0 :=
45-
integerComplement.ne_zero ((integerComplement.add_coe_int_mem a).mpr hx)
53+
integerComplement.ne_zero ((add_intCast_mem_integerComplement a).mpr hx)
4654

4755
lemma integerComplement.ne_one {x : ℂ} (hx : x ∈ ℂ_ℤ) : x ≠ 1 :=
4856
fun hx' ↦ hx ⟨1, by exact_mod_cast hx'.symm⟩
@@ -54,14 +62,13 @@ lemma integerComplement_pow_two_ne_pow_two {x : ℂ} (hx : x ∈ ℂ_ℤ) (n :
5462

5563
lemma upperHalfPlane_inter_integerComplement :
5664
{z : ℂ | 0 < z.im} ∩ ℂ_ℤ = {z : ℂ | 0 < z.im} := by
57-
ext z
58-
simp only [Set.mem_inter_iff, Set.mem_setOf_eq, and_iff_left_iff_imp]
59-
exact fun hz ↦ UpperHalfPlane.coe_mem_integerComplement ⟨z, hz⟩
65+
apply Set.inter_eq_self_of_subset_left
66+
exact fun z hz ↦ UpperHalfPlane.coe_mem_integerComplement ⟨z, hz⟩
6067

6168
lemma _root_.UpperHalfPlane.int_div_mem_integerComplement (z : ℍ) {n : ℤ} (hn : n ≠ 0) :
6269
n / (z : ℂ) ∈ ℂ_ℤ := by
6370
rintro ⟨_, hm⟩
64-
have : (n / (z : ℂ)).im ≠ 0 := by simp [div_im, hn, z.im_pos.ne', ne_zero z]
71+
have : (n / (z : ℂ)).im ≠ 0 := by simp [div_im, z.ne_zero, hn, z.im_ne_zero]
6572
simpa [← hm]
6673

6774
end Complex

Mathlib/Analysis/Complex/Periodic.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@ theorem norm_qParam_lt_iff (hh : 0 < h) (A : ℝ) (z : ℂ) :
7777
lemma qParam_ne_zero (z : ℂ) : 𝕢 h z ≠ 0 := by
7878
simp [qParam, exp_ne_zero]
7979

80+
@[fun_prop]
81+
lemma continuous_qParam : Continuous (𝕢 h) := by
82+
unfold qParam
83+
fun_prop
84+
8085
@[fun_prop]
8186
lemma differentiable_qParam : Differentiable ℂ (𝕢 h) := by
8287
unfold qParam

Mathlib/Analysis/Complex/UpperHalfPlane/Basic.lean

Lines changed: 78 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -21,29 +21,41 @@ We define the notation `ℍ` for the upper half plane available in the locale
2121
noncomputable section
2222

2323
/-- The open upper half plane, denoted as `ℍ` within the `UpperHalfPlane` namespace -/
24-
def UpperHalfPlane :=
25-
{ point : ℂ // 0 < point.im }
24+
@[ext]
25+
structure UpperHalfPlane where
26+
/-- Canonical embedding of the upper half-plane into `ℂ`. -/
27+
protected coe : ℂ
28+
coe_im_pos : 0 < coe.im
2629

2730
@[inherit_doc] scoped[UpperHalfPlane] notation "ℍ" => UpperHalfPlane
2831

2932
open UpperHalfPlane
3033

3134
namespace UpperHalfPlane
3235

33-
/-- Canonical embedding of the upper half-plane into `ℂ`. -/
34-
@[coe] protected def coe (z : ℍ) : ℂ := z.1
36+
attribute [coe] UpperHalfPlane.coe
3537

3638
instance : CoeOut ℍ ℂ := ⟨UpperHalfPlane.coe⟩
3739

38-
instance : Inhabited ℍ :=
39-
⟨⟨Complex.I, by simp⟩⟩
40+
/-- Define I := √-1 as an element on the upper half plane. -/
41+
def I : ℍ := ⟨Complex.I, zero_lt_one⟩
42+
43+
instance : Inhabited ℍ := ⟨.I⟩
44+
45+
@[simp, norm_cast] theorem coe_inj {a b : ℍ} : (a : ℂ) = b ↔ a = b := UpperHalfPlane.ext_iff.symm
46+
47+
@[deprecated (since := "2026-01-31")] alias ext_iff' := coe_inj
48+
49+
theorem coe_injective : Function.Injective UpperHalfPlane.coe := fun _ _ ↦ UpperHalfPlane.ext
4050

41-
@[ext] theorem ext {a b : ℍ} (h : (a : ℂ) = b) : a = b := Subtype.ext h
51+
instance canLift : CanLift ℂ ℍ ((↑) : ℍ → ℂ) fun z => 0 < z.im where
52+
prf z hz := ⟨⟨z, hz⟩, rfl⟩
4253

43-
@[simp, norm_cast] theorem ext_iff' {a b : ℍ} : (a : ℂ) = b ↔ a = b := UpperHalfPlane.ext_iff.symm
54+
protected theorem «forall» {P : ℍ → Prop} : (∀ z, P z) ↔ ∀ z hz, P ⟨z, hz⟩ :=
55+
fun h z hz ↦ h ⟨z, hz⟩, fun h z ↦ h z.1 z.2
4456

45-
instance canLift : CanLift ℂ((↑) : ℍ → ℂ) fun z => 0 < z.im :=
46-
Subtype.canLift fun (z : ℂ) => 0 < z.im
57+
protected theorem «exists» {P :Prop} : (∃ z, P z) ↔ ∃ z hz, P ⟨z, hz⟩ :=
58+
fun ⟨⟨z, hz⟩, hP⟩ ↦ ⟨z, hz, hP⟩, fun ⟨z, hz, hP⟩ ↦ ⟨⟨z, hz⟩, hP⟩⟩
4759

4860
/-- Imaginary part -/
4961
def im (z : ℍ) :=
@@ -54,13 +66,11 @@ def re (z : ℍ) :=
5466
(z : ℂ).re
5567

5668
/-- Extensionality lemma in terms of `UpperHalfPlane.re` and `UpperHalfPlane.im`. -/
57-
theorem ext' {a b : ℍ} (hre : a.re = b.re) (him : a.im = b.im) : a = b :=
58-
ext <| Complex.ext hre him
69+
theorem ext_re_im {a b : ℍ} (hre : a.re = b.re) (him : a.im = b.im) : a = b :=
70+
UpperHalfPlane.ext <| Complex.ext hre him
5971

60-
/-- Constructor for `UpperHalfPlane`. It is useful if `⟨z, h⟩` makes Lean use a wrong
61-
typeclass instance. -/
62-
def mk (z : ℂ) (h : 0 < z.im) : ℍ :=
63-
⟨z, h⟩
72+
@[deprecated (since := "2026-01-29")]
73+
alias ext' := ext_re_im
6474

6575
@[simp]
6676
theorem coe_im (z : ℍ) : (z : ℂ).im = z.im :=
@@ -78,48 +88,38 @@ theorem mk_re (z : ℂ) (h : 0 < z.im) : (mk z h).re = z.re :=
7888
theorem mk_im (z : ℂ) (h : 0 < z.im) : (mk z h).im = z.im :=
7989
rfl
8090

81-
@[simp]
8291
theorem coe_mk (z : ℂ) (h : 0 < z.im) : (mk z h : ℂ) = z :=
8392
rfl
8493

8594
@[simp]
86-
lemma coe_mk_subtype {z : ℂ} (hz : 0 < z.im) :
87-
UpperHalfPlane.coe ⟨z, hz⟩ = z := by
95+
theorem mk_coe (z : ℍ) (h : 0 < (z : ℂ).im := z.2) : mk z h = z :=
8896
rfl
8997

90-
instance : Nontrivial ℍ := by
91-
constructor
92-
use ⟨Complex.I, by simp⟩, ⟨2 * Complex.I, by simp⟩
93-
simp [ne_eq, UpperHalfPlane.ext_iff]
98+
@[simp]
99+
lemma I_im : I.im = 1 := rfl
94100

95101
@[simp]
96-
theorem mk_coe (z : ℍ) (h : 0 < (z : ℂ).im := z.2) : mk z h = z :=
102+
lemma I_re : I.re = 0 := rfl
103+
104+
@[simp, norm_cast]
105+
lemma coe_I : I = Complex.I := rfl
106+
107+
@[deprecated coe_mk (since := "2026-01-29")]
108+
lemma coe_mk_subtype {z : ℂ} (hz : 0 < z.im) :
109+
UpperHalfPlane.coe ⟨z, hz⟩ = z :=
97110
rfl
98111

99112
theorem re_add_im (z : ℍ) : (z.re + z.im * Complex.I : ℂ) = z :=
100113
Complex.re_add_im z
101114

102-
theorem im_pos (z : ℍ) : 0 < z.im :=
103-
z.2
115+
theorem im_pos (z : ℍ) : 0 < z.im := z.coe_im_pos
104116

105117
theorem im_ne_zero (z : ℍ) : z.im ≠ 0 :=
106118
z.im_pos.ne'
107119

108120
theorem ne_zero (z : ℍ) : (z : ℂ) ≠ 0 :=
109121
mt (congr_arg Complex.im) z.im_ne_zero
110122

111-
/-- Define I := √-1 as an element on the upper half plane. -/
112-
def I : ℍ := ⟨Complex.I, by simp⟩
113-
114-
@[simp]
115-
lemma I_im : I.im = 1 := rfl
116-
117-
@[simp]
118-
lemma I_re : I.re = 0 := rfl
119-
120-
@[simp, norm_cast]
121-
lemma coe_I : I = Complex.I := rfl
122-
123123
end UpperHalfPlane
124124

125125
namespace Mathlib.Meta.Positivity
@@ -155,30 +155,31 @@ theorem normSq_ne_zero (z : ℍ) : Complex.normSq (z : ℂ) ≠ 0 :=
155155
(normSq_pos z).ne'
156156

157157
theorem im_inv_neg_coe_pos (z : ℍ) : 0 < (-z : ℂ)⁻¹.im := by
158-
simpa [neg_div] using div_pos z.property (normSq_pos z)
158+
simpa [neg_div] using div_pos z.im_pos (normSq_pos z)
159159

160160
lemma im_pnat_div_pos (n : ℕ) [NeZero n] (z : ℍ) : 0 < (-(n : ℂ) / z).im := by
161161
suffices 0 < n * z.im / Complex.normSq z by simpa [Complex.div_im, neg_div]
162162
positivity [NeZero.ne n, z.normSq_pos]
163163

164-
lemma ne_nat (z : ℍ) : ∀ n : ℕ, z.1 ≠ n := by
165-
intro n
166-
have h1 := z.2
167-
aesop
164+
lemma ne_ofReal (z : ℍ) (x : ℝ) : (z : ℂ) ≠ x :=
165+
ne_of_apply_ne Complex.im <| by simp [im_ne_zero]
166+
167+
lemma ne_intCast (z : ℍ) (n : ℤ) : (z : ℂ) ≠ n := mod_cast ne_ofReal z n
168+
169+
@[deprecated (since := "2026-01-29")] alias ne_int := ne_intCast
168170

169-
lemma ne_int (z : ℍ) : ∀ n : ℤ, z.1 ≠ n := by
170-
intro n
171-
have h1 := z.2
172-
aesop
171+
lemma ne_natCast (z : ℍ) (n : ℕ) : (z : ℂ) ≠ n := mod_cast ne_intCast z n
172+
173+
@[deprecated (since := "2026-01-29")] alias ne_nat := ne_natCast
173174

174175
section PosRealAction
175176

176-
instance posRealAction : MulAction { x : ℝ // 0 < x } ℍ where
177-
smul x z := mk ((x : ℝ) • (z : ℂ)) <| by simpa using mul_pos x.2 z.2
178-
one_smul _ := Subtype.ext <| one_smul _ _
179-
mul_smul x y z := Subtype.ext <| mul_smul (x : ℝ) y (z : ℂ)
177+
instance posRealAction : MulAction {x : ℝ // 0 < x} ℍ where
178+
smul x z := mk ((x : ℝ) • (z : ℂ)) <| by simpa using mul_pos x.2 z.im_pos
179+
one_smul _ := UpperHalfPlane.ext <| one_smul _ _
180+
mul_smul x y z := UpperHalfPlane.ext <| mul_smul (x : ℝ) y (z : ℂ)
180181

181-
variable (x : { x : ℝ // 0 < x }) (z : ℍ)
182+
variable (x : {x : ℝ // 0 < x}) (z : ℍ)
182183

183184
@[simp]
184185
theorem coe_pos_real_smul : ↑(x • z) = (x : ℝ) • (z : ℂ) :=
@@ -192,14 +193,19 @@ theorem pos_real_im : (x • z).im = x * z.im :=
192193
theorem pos_real_re : (x • z).re = x * z.re :=
193194
Complex.smul_re _ _
194195

196+
theorem pos_real_smul_injective (z : ℍ) :
197+
Function.Injective fun x : {x : ℝ // 0 < x} ↦ x • z := by
198+
rintro ⟨x, hx⟩ ⟨y, hy⟩ h
199+
simp_all [UpperHalfPlane.ext_iff, ne_zero]
200+
195201
end PosRealAction
196202

197203
section RealAddAction
198204

199205
instance : AddAction ℝ ℍ where
200206
vadd x z := mk (x + z) <| by simpa using z.im_pos
201-
zero_vadd _ := Subtype.ext <| by simp [HVAdd.hVAdd]
202-
add_vadd x y z := Subtype.ext <| by simp [HVAdd.hVAdd, add_assoc]
207+
zero_vadd _ := by simp [HVAdd.hVAdd]
208+
add_vadd x y z := by simp [HVAdd.hVAdd, add_assoc]
203209

204210
variable (x : ℝ) (z : ℍ)
205211

@@ -215,18 +221,34 @@ theorem vadd_re : (x +ᵥ z).re = x + z.re :=
215221
theorem vadd_im : (x +ᵥ z).im = z.im :=
216222
zero_add _
217223

224+
@[simp]
225+
protected theorem vadd_right_cancel_iff {x y : ℝ} (z : ℍ) : x +ᵥ z = y +ᵥ z ↔ x = y := by
226+
simp [UpperHalfPlane.ext_iff]
227+
228+
protected theorem vadd_left_injective (z : ℍ) : Function.Injective fun x : ℝ ↦ x +ᵥ z := by
229+
simp [Function.Injective]
230+
231+
instance : Infinite ℍ :=
232+
.of_injective _ <| UpperHalfPlane.vadd_left_injective I
233+
234+
instance : Nontrivial ℍ := inferInstance
235+
218236
end RealAddAction
219237

220238
section upperHalfPlaneSet
221239

222-
/-- The upper half plane as a subset of `ℂ`. This is convenient for taking derivatives of functions
223-
on the upper half plane. -/
240+
/-- The upper half plane as a subset of `ℂ`.
241+
This is convenient for taking derivatives of functions on the upper half plane. -/
224242
abbrev upperHalfPlaneSet := {z : ℂ | 0 < z.im}
225243

226244
local notation "ℍₒ" => upperHalfPlaneSet
227245

228246
lemma isOpen_upperHalfPlaneSet : IsOpen ℍₒ := isOpen_lt continuous_const Complex.continuous_im
229247

248+
@[simp]
249+
theorem range_coe : Set.range UpperHalfPlane.coe = ℍₒ := by
250+
ext; simp [UpperHalfPlane.exists]
251+
230252
end upperHalfPlaneSet
231253

232254
end UpperHalfPlane

Mathlib/Analysis/Complex/UpperHalfPlane/FunctionsBoundedAtInfty.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def atImInfty :=
3434
instance : atImInfty.NeBot := by
3535
refine comap_neBot_iff_frequently.mpr (Eventually.frequently ?_)
3636
filter_upwards [eventually_gt_atTop 0] with t ht
37-
using ⟨⟨I * t, by simp [ht]⟩, by simp [← coe_im]
37+
using ⟨⟨I * t, by simp [ht]⟩, by simp⟩
3838

3939
theorem atImInfty_basis : atImInfty.HasBasis (fun _ => True) fun i : ℝ => im ⁻¹' Set.Ici i :=
4040
Filter.HasBasis.comap UpperHalfPlane.im Filter.atTop_basis
@@ -80,7 +80,7 @@ lemma tendsto_comap_im_ofComplex :
8080
simp only [atImInfty, tendsto_comap_iff, Function.comp_def]
8181
refine tendsto_comap.congr' ?_
8282
filter_upwards [preimage_mem_comap (Ioi_mem_atTop 0)] with z hz
83-
simp only [ofComplex_apply_of_im_pos hz, ← UpperHalfPlane.coe_im, coe_mk_subtype]
83+
simp [ofComplex_apply_of_im_pos hz]
8484

8585
lemma tendsto_coe_atImInfty :
8686
Tendsto UpperHalfPlane.coe atImInfty (comap Complex.im atTop) := by

Mathlib/Analysis/Complex/UpperHalfPlane/Manifold.lean

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,8 @@ lemma eq_zero_of_frequently {f : ℍ → ℂ} (hf : MDifferentiable 𝓘(ℂ)
124124
rw [UpperHalfPlane.mdifferentiable_iff] at hf
125125
have := hf.analyticOnNhd isOpen_upperHalfPlaneSet
126126
ext w
127-
convert this.eqOn_zero_of_preconnected_of_frequently_eq_zero (z₀ := ↑τ) ?_ τ.2 ?_ w.property
128-
· rw [Function.comp_apply, ofComplex_apply_of_im_pos w.property]
129-
rfl
127+
convert this.eqOn_zero_of_preconnected_of_frequently_eq_zero (z₀ := ↑τ) ?_ τ.2 ?_ w.im_pos
128+
· rw [Function.comp_apply, ofComplex_apply]
130129
· exact (Complex.isConnected_of_upperHalfPlane subset_rfl (by grind)).isPreconnected
131130
· contrapose! hτ
132131
rw [eventually_nhdsWithin_iff, ← isOpenEmbedding_coe.map_nhds_eq, eventually_map] at hτ

Mathlib/Analysis/Complex/UpperHalfPlane/Metric.lean

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,8 @@ theorem center_im (z r) : (center z r).im = z.im * Real.cosh r :=
137137
rfl
138138

139139
@[simp]
140-
theorem center_zero (z : ℍ) : center z 0 = z :=
141-
ext' rfl <| by rw [center_im, Real.cosh_zero, mul_one]
140+
theorem center_zero (z : ℍ) : center z 0 = z := by
141+
apply ext_re_im <;> simp
142142

143143
theorem dist_coe_center_sq (z w : ℍ) (r : ℝ) : dist (z : ℂ) (w.center r) ^ 2 =
144144
2 * z.im * w.im * (Real.cosh (dist z w) - Real.cosh r) + (w.im * Real.sinh r) ^ 2 := by
@@ -304,7 +304,7 @@ theorem image_coe_sphere (z : ℍ) (r : ℝ) :
304304

305305
instance : ProperSpace ℍ := by
306306
refine ⟨fun z r => ?_⟩
307-
rw [IsInducing.subtypeVal.isCompact_iff (f := ((↑) : ℍ → ℂ)), image_coe_closedBall]
307+
rw [isEmbedding_coe.isCompact_iff (f := ((↑) : ℍ → ℂ)), image_coe_closedBall]
308308
apply isCompact_closedBall
309309

310310
theorem isometry_vertical_line (a : ℝ) : Isometry fun y => mk ⟨a, exp y⟩ (exp_pos y) := by
@@ -327,9 +327,9 @@ instance : IsIsometricSMul SL(2, ℝ) ℍ :=
327327
fun g => by
328328
have h₀ : Isometry (fun z => ModularGroup.S • z : ℍ → ℍ) :=
329329
Isometry.of_dist_eq fun y₁ y₂ => by
330-
have h₁ : 0 ≤ im y₁ * im y₂ := mul_nonneg y₁.property.le y₂.property.le
330+
have h₁ : 0 ≤ im y₁ * im y₂ := by positivity
331331
have h₂ : ‖(y₁ * y₂ : ℂ)‖ ≠ 0 := by simp [y₁.ne_zero, y₂.ne_zero]
332-
simp_rw [modular_S_smul, inv_neg, dist_eq, coe_mk, dist_neg_neg,
332+
simp_rw [modular_S_smul, inv_neg, dist_eq, dist_neg_neg,
333333
dist_inv_inv₀ y₁.ne_zero y₂.ne_zero, mk_im, neg_im, inv_im, coe_im, neg_div, neg_neg,
334334
div_mul_div_comm, ← normSq_mul, Real.sqrt_div h₁, ← norm_def, mul_div (2 : ℝ)]
335335
rw [div_div_div_comm, ← norm_mul, div_self h₂, div_one]

Mathlib/Analysis/Complex/UpperHalfPlane/MoebiusAction.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ lemma denom_cocycle_σ (g h : GL (Fin 2) ℝ) (z : ℍ) :
221221
denom_cocycle' g h z
222222

223223
lemma glPos_smul_def {g : GL (Fin 2) ℝ} (hg : 0 < g.det.val) (z : ℍ) :
224-
g • z = mk (num g z / denom g z) (coe_smul_of_det_pos hg z ▸ (g • z).property) := by
224+
g • z = num g z / denom g z, coe_smul_of_det_pos hg z ▸ (g • z).im_pos⟩ := by
225225
ext; simp [coe_smul_of_det_pos hg]
226226

227227
variable (g : GL (Fin 2) ℝ) (z : ℍ)
@@ -272,7 +272,7 @@ theorem specialLinearGroup_apply {R : Type*} [CommRing R] [Algebra R ℝ] (g : S
272272
g • z = mk
273273
(((algebraMap R ℝ (g 0 0) : ℂ) * z + (algebraMap R ℝ (g 0 1) : ℂ)) /
274274
((algebraMap R ℝ (g 1 0) : ℂ) * z + (algebraMap R ℝ (g 1 1) : ℂ)))
275-
(coe_specialLinearGroup_apply g z ▸ (g • z).property) := by
275+
(coe_specialLinearGroup_apply g z ▸ (g • z).im_pos) := by
276276
ext; simp [coe_specialLinearGroup_apply]
277277

278278
/- these next few lemmas are *not* flagged `@simp` because of the constructors on the RHS;

0 commit comments

Comments
 (0)