Skip to content

Commit bc2fc2d

Browse files
feat: port Algebra.Ring.Ulift (#1240)
Most of the porting consists of doing by hand what `pi_instance_derive_field` did. Co-authored-by: ChrisHughes24 <chrishughes24@gmail.com>
1 parent 95f1594 commit bc2fc2d

File tree

2 files changed

+191
-0
lines changed

2 files changed

+191
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ import Mathlib.Algebra.Ring.Pi
131131
import Mathlib.Algebra.Ring.Prod
132132
import Mathlib.Algebra.Ring.Regular
133133
import Mathlib.Algebra.Ring.Semiconj
134+
import Mathlib.Algebra.Ring.ULift
134135
import Mathlib.Algebra.Ring.Units
135136
import Mathlib.Algebra.SMulWithZero
136137
import Mathlib.CategoryTheory.Category.Basic

Mathlib/Algebra/Ring/ULift.lean

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
/-
2+
Copyright (c) 2020 Scott Morrison. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Scott Morrison
5+
6+
! This file was ported from Lean 3 source module algebra.ring.ulift
7+
! leanprover-community/mathlib commit 207cfac9fcd06138865b5d04f7091e46d9320432
8+
! Please do not edit these lines, except to modify the commit id
9+
! if you have ported upstream changes.
10+
-/
11+
import Mathlib.Algebra.Group.ULift
12+
import Mathlib.Algebra.Field.Defs
13+
import Mathlib.Algebra.Ring.Equiv
14+
15+
/-!
16+
# `ULift` instances for ring
17+
18+
This file defines instances for ring, semiring and related structures on `ULift` types.
19+
20+
(Recall `ULift α` is just a "copy" of a type `α` in a higher universe.)
21+
22+
We also provide `ULift.ringEquiv : ULift R ≃+* R`.
23+
-/
24+
25+
26+
universe u v
27+
28+
variable {α : Type u}
29+
namespace ULift
30+
31+
-- Porting note: All these instances used `refine_struct` and `pi_instance_derive_field`
32+
33+
instance mulZeroClass [MulZeroClass α] : MulZeroClass (ULift α) :=
34+
{ zero := (0 : ULift α), mul := (· * ·), zero_mul := fun _ => (Equiv.ulift).injective (by simp),
35+
mul_zero := fun _ => (Equiv.ulift).injective (by simp) }
36+
#align ulift.mul_zero_class ULift.mulZeroClass
37+
38+
instance distrib [Distrib α] : Distrib (ULift α) :=
39+
{ add := (· + ·), mul := (· * ·),
40+
left_distrib := fun _ _ _ => (Equiv.ulift).injective (by simp [left_distrib]),
41+
right_distrib := fun _ _ _ => (Equiv.ulift).injective (by simp [right_distrib]) }
42+
#align ulift.distrib ULift.distrib
43+
44+
instance nonUnitalNonAssocSemiring [NonUnitalNonAssocSemiring α] :
45+
NonUnitalNonAssocSemiring (ULift α) :=
46+
{ zero := (0 : ULift α), add := (· + ·), mul := (· * ·), nsmul := AddMonoid.nsmul,
47+
zero_add, add_zero, zero_mul, mul_zero, left_distrib, right_distrib,
48+
nsmul_zero := fun _ => AddMonoid.nsmul_zero _,
49+
nsmul_succ := fun _ _ => AddMonoid.nsmul_succ _ _,
50+
add_assoc, add_comm }
51+
#align ulift.non_unital_non_assoc_semiring ULift.nonUnitalNonAssocSemiring
52+
53+
instance nonAssocSemiring [NonAssocSemiring α] : NonAssocSemiring (ULift α) :=
54+
{ ULift.addMonoidWithOne with
55+
zero := (0 : ULift α), one := (1 : ULift α), add := (· + ·), mul := (· * ·),
56+
nsmul := AddMonoid.nsmul, natCast := fun n => ULift.up n, add_comm, left_distrib,
57+
right_distrib, zero_mul, mul_zero, one_mul, mul_one }
58+
#align ulift.non_assoc_semiring ULift.nonAssocSemiring
59+
60+
instance nonUnitalSemiring [NonUnitalSemiring α] : NonUnitalSemiring (ULift α) :=
61+
{ zero := (0 : ULift α), add := (· + ·), mul := (· * ·), nsmul := AddMonoid.nsmul,
62+
add_assoc, zero_add, add_zero, add_comm, left_distrib, right_distrib, zero_mul, mul_zero,
63+
mul_assoc, nsmul_zero := fun _ => AddMonoid.nsmul_zero _,
64+
nsmul_succ := fun _ _ => AddMonoid.nsmul_succ _ _ }
65+
#align ulift.non_unital_semiring ULift.nonUnitalSemiring
66+
67+
instance semiring [Semiring α] : Semiring (ULift α) :=
68+
{ ULift.addMonoidWithOne with
69+
zero := (0 : ULift α), one := 1, add := (· + ·), mul := (· * ·), nsmul := AddMonoid.nsmul,
70+
npow := Monoid.npow, natCast := fun n => ULift.up n, add_comm, left_distrib, right_distrib,
71+
zero_mul, mul_zero, mul_assoc, one_mul, mul_one, npow_zero := fun _ => Monoid.npow_zero _,
72+
npow_succ := fun _ _ => Monoid.npow_succ _ _ }
73+
#align ulift.semiring ULift.semiring
74+
75+
/-- The ring equivalence between `ULift α` and `α`.-/
76+
def ringEquiv [NonUnitalNonAssocSemiring α] : ULift α ≃+* α where
77+
toFun := ULift.down
78+
invFun := ULift.up
79+
map_mul' _ _ := rfl
80+
map_add' _ _ := rfl
81+
left_inv := fun _ => rfl
82+
right_inv := fun _ => rfl
83+
#align ulift.ring_equiv ULift.ringEquiv
84+
85+
instance nonUnitalCommSemiring [NonUnitalCommSemiring α] : NonUnitalCommSemiring (ULift α) :=
86+
{ zero := (0 : ULift α), add := (· + ·), mul := (· * ·), nsmul := AddMonoid.nsmul, add_assoc,
87+
zero_add, add_zero, add_comm, left_distrib, right_distrib, zero_mul, mul_zero, mul_assoc,
88+
mul_comm, nsmul_zero := fun _ => AddMonoid.nsmul_zero _,
89+
nsmul_succ := fun _ _ => AddMonoid.nsmul_succ _ _ }
90+
#align ulift.non_unital_comm_semiring ULift.nonUnitalCommSemiring
91+
92+
instance commSemiring [CommSemiring α] : CommSemiring (ULift α) :=
93+
{ ULift.semiring with
94+
zero := (0 : ULift α), one := (1 : ULift α), add := (· + ·), mul := (· * ·),
95+
nsmul := AddMonoid.nsmul, natCast := fun n => ULift.up n, npow := Monoid.npow, mul_comm }
96+
#align ulift.comm_semiring ULift.commSemiring
97+
98+
instance nonUnitalNonAssocRing [NonUnitalNonAssocRing α] : NonUnitalNonAssocRing (ULift α) :=
99+
{ zero := (0 : ULift α), add := (· + ·), mul := (· * ·), sub := Sub.sub, neg := Neg.neg,
100+
nsmul := AddMonoid.nsmul, zsmul := SubNegMonoid.zsmul, add_assoc, zero_add, add_zero,
101+
add_left_neg, add_comm, left_distrib, right_distrib, zero_mul, mul_zero, sub_eq_add_neg,
102+
nsmul_zero := fun _ => AddMonoid.nsmul_zero _,
103+
nsmul_succ := fun _ _ => AddMonoid.nsmul_succ _ _,
104+
zsmul_zero' := SubNegMonoid.zsmul_zero', zsmul_succ' := SubNegMonoid.zsmul_succ',
105+
zsmul_neg' := SubNegMonoid.zsmul_neg' }
106+
#align ulift.non_unital_non_assoc_ring ULift.nonUnitalNonAssocRing
107+
108+
instance nonUnitalRing [NonUnitalRing α] : NonUnitalRing (ULift α) :=
109+
{ zero := (0 : ULift α), add := (· + ·), mul := (· * ·), sub := Sub.sub, neg := Neg.neg,
110+
nsmul := AddMonoid.nsmul, zsmul := SubNegMonoid.zsmul, add_assoc, zero_add, add_zero, add_comm,
111+
add_left_neg, left_distrib, right_distrib, zero_mul, mul_zero, mul_assoc, sub_eq_add_neg
112+
nsmul_zero := fun _ => AddMonoid.nsmul_zero _,
113+
nsmul_succ := fun _ _ => AddMonoid.nsmul_succ _ _,
114+
zsmul_zero' := SubNegMonoid.zsmul_zero', zsmul_succ' := SubNegMonoid.zsmul_succ',
115+
zsmul_neg' := SubNegMonoid.zsmul_neg' }
116+
#align ulift.non_unital_ring ULift.nonUnitalRing
117+
118+
instance nonAssocRing [NonAssocRing α] : NonAssocRing (ULift α) :=
119+
{ zero := (0 : ULift α), one := (1 : ULift α), add := (· + ·), mul := (· * ·), sub := Sub.sub,
120+
neg := Neg.neg, nsmul := AddMonoid.nsmul, natCast := fun n => ULift.up n,
121+
intCast := fun n => ULift.up n, zsmul := SubNegMonoid.zsmul,
122+
intCast_ofNat := addGroupWithOne.intCast_ofNat, add_assoc, zero_add,
123+
add_zero, add_left_neg, add_comm, left_distrib, right_distrib, zero_mul, mul_zero, one_mul,
124+
mul_one, sub_eq_add_neg, nsmul_zero := fun _ => AddMonoid.nsmul_zero _,
125+
nsmul_succ := fun _ _ => AddMonoid.nsmul_succ _ _,
126+
zsmul_zero' := SubNegMonoid.zsmul_zero', zsmul_succ' := SubNegMonoid.zsmul_succ',
127+
zsmul_neg' := SubNegMonoid.zsmul_neg',
128+
natCast_zero := AddMonoidWithOne.natCast_zero, natCast_succ := AddMonoidWithOne.natCast_succ,
129+
intCast_negSucc := AddGroupWithOne.intCast_negSucc }
130+
#align ulift.non_assoc_ring ULift.nonAssocRing
131+
132+
instance ring [Ring α] : Ring (ULift α) :=
133+
{ zero := (0 : ULift α), one := (1 : ULift α), add := (· + ·), mul := (· * ·), sub := Sub.sub,
134+
neg := Neg.neg, nsmul := AddMonoid.nsmul, npow := Monoid.npow, zsmul := SubNegMonoid.zsmul,
135+
intCast_ofNat := addGroupWithOne.intCast_ofNat, add_assoc, zero_add, add_zero, add_comm,
136+
left_distrib, right_distrib, zero_mul, mul_zero, mul_assoc, one_mul, mul_one, sub_eq_add_neg,
137+
add_left_neg, nsmul_zero := fun _ => AddMonoid.nsmul_zero _, natCast := fun n => ULift.up n,
138+
intCast := fun n => ULift.up n, nsmul_succ := fun _ _ => AddMonoid.nsmul_succ _ _,
139+
natCast_zero := AddMonoidWithOne.natCast_zero, natCast_succ := AddMonoidWithOne.natCast_succ,
140+
npow_zero := fun _ => Monoid.npow_zero _, npow_succ := fun _ _ => Monoid.npow_succ _ _,
141+
zsmul_zero' := SubNegMonoid.zsmul_zero', zsmul_succ' := SubNegMonoid.zsmul_succ',
142+
zsmul_neg' := SubNegMonoid.zsmul_neg', intCast_negSucc := AddGroupWithOne.intCast_negSucc }
143+
#align ulift.ring ULift.ring
144+
145+
instance nonUnitalCommRing [NonUnitalCommRing α] : NonUnitalCommRing (ULift α) :=
146+
{ zero := (0 : ULift α), add := (· + ·), mul := (· * ·), sub := Sub.sub, neg := Neg.neg,
147+
nsmul := AddMonoid.nsmul, zsmul := SubNegMonoid.zsmul, zero_mul, add_assoc, zero_add, add_zero,
148+
mul_zero, left_distrib, right_distrib, add_comm, mul_assoc, mul_comm,
149+
nsmul_zero := fun _ => AddMonoid.nsmul_zero _, add_left_neg,
150+
nsmul_succ := fun _ _ => AddMonoid.nsmul_succ _ _, sub_eq_add_neg,
151+
zsmul_zero' := SubNegMonoid.zsmul_zero',
152+
zsmul_succ' := SubNegMonoid.zsmul_succ',
153+
zsmul_neg' := SubNegMonoid.zsmul_neg'.. }
154+
#align ulift.non_unital_comm_ring ULift.nonUnitalCommRing
155+
156+
instance commRing [CommRing α] : CommRing (ULift α) :=
157+
{ ULift.ring with mul_comm }
158+
#align ulift.comm_ring ULift.commRing
159+
160+
instance [HasRatCast α] : HasRatCast (ULift α) :=
161+
fun a => ULift.up ↑a⟩
162+
163+
@[simp]
164+
theorem rat_cast_down [HasRatCast α] (n : ℚ) : ULift.down (n : ULift α) = n := rfl
165+
#align ulift.rat_cast_down ULift.rat_cast_down
166+
167+
instance field [Field α] : Field (ULift α) :=
168+
{ @ULift.nontrivial α _, ULift.commRing with
169+
inv := Inv.inv
170+
div := Div.div
171+
zpow := fun n a => ULift.up (a.down ^ n)
172+
ratCast := fun a => (a : ULift α)
173+
ratCast_mk := fun a b h1 h2 => by
174+
apply ULift.down_inj.1
175+
dsimp [HasRatCast.ratCast]
176+
exact Field.ratCast_mk a b h1 h2
177+
qsmul := (· • ·)
178+
inv_zero
179+
div_eq_mul_inv
180+
qsmul_eq_mul' := fun _ _ => by
181+
apply ULift.down_inj.1
182+
dsimp [HasRatCast.ratCast]
183+
exact DivisionRing.qsmul_eq_mul' _ _
184+
zpow_zero' := DivInvMonoid.zpow_zero'
185+
zpow_succ' := DivInvMonoid.zpow_succ'
186+
zpow_neg' := DivInvMonoid.zpow_neg'
187+
mul_inv_cancel := fun _ ha => by simp [ULift.down_inj.1, ha] }
188+
#align ulift.field ULift.field
189+
190+
end ULift

0 commit comments

Comments
 (0)