Built with
doc-gen4 , running Lean4.
Bubbles (
) indicate interactive fragments: hover for details, tap to reveal contents.
Use
Ctrl+↑ Ctrl+↓ to navigate,
Ctrl+🖱️ to focus.
On Mac, use
Cmd instead of
Ctrl .
/-
Copyright (c) 2020 Scott Morrison. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Scott Morrison
! This file was ported from Lean 3 source module algebra.group.ulift
! leanprover-community/mathlib commit 564bcc44d2b394a50c0cd6340c14a6b02a50a99a
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Data.Int.Cast.Defs
import Mathlib.Algebra.Hom.Equiv.Basic
import Mathlib.Algebra.GroupWithZero.InjSurj
/-!
# `ULift` instances for groups and monoids
This file defines instances for group, monoid, semigroup and related structures on `ULift` types.
(Recall `ULift α` is just a "copy" of a type `α` in a higher universe.)
We also provide `MulEquiv.ulift : ULift R ≃* R` (and its additive analogue).
-/
universe u v
variable { α : Type u } { β : Type _ } { x y : ULift : Type ?u.1023 → Type (max?u.1023v) ULift.{v} α }
namespace ULift
@[ to_additive ]
instance one [ One α ] : One ( ULift : Type ?u.28 → Type (max?u.28?u.29) ULift α ) :=
⟨⟨ 1 ⟩⟩
#align ulift.has_one ULift.one
#align ulift.has_zero ULift.zero
@[ to_additive : ∀ {α : Type u} [inst : Zero α ], 0 .down = 0 to_additive ( attr := simp )]
theorem one_down : ∀ [inst : One α ], 1 .down = 1 one_down [ One α ] : ( 1 : ULift : Type ?u.169 → Type (max?u.169?u.170) ULift α ). down = 1 :=
rfl : ∀ {α : Sort ?u.249} {a : α }, a = a rfl
#align ulift.one_down ULift.one_down : ∀ {α : Type u} [inst : One α ], 1 .down = 1 ULift.one_down
#align ulift.zero_down ULift.zero_down : ∀ {α : Type u} [inst : Zero α ], 0 .down = 0 ULift.zero_down
@[ to_additive ]
instance mul [ Mul α ] : Mul ( ULift : Type ?u.297 → Type (max?u.297?u.298) ULift α ) :=
⟨ fun f g => ⟨ f . down * g . down ⟩⟩
#align ulift.has_mul ULift.mul
#align ulift.has_add ULift.add
@[ to_additive : ∀ {α : Type u} {x y : ULift α } [inst : Add α ], (x + y ).down = x .down + y .down to_additive ( attr := simp )]
theorem mul_down : ∀ [inst : Mul α ], (x * y ).down = x .down * y .down mul_down [ Mul α ] : ( x * y ). down = x . down * y . down :=
rfl : ∀ {α : Sort ?u.682} {a : α }, a = a rfl
#align ulift.mul_down ULift.mul_down : ∀ {α : Type u} {x y : ULift α } [inst : Mul α ], (x * y ).down = x .down * y .down ULift.mul_down
#align ulift.add_down ULift.add_down : ∀ {α : Type u} {x y : ULift α } [inst : Add α ], (x + y ).down = x .down + y .down ULift.add_down
@[ to_additive ]
instance div [ Div α ] : Div ( ULift : Type ?u.754 → Type (max?u.754?u.755) ULift α ) :=
⟨ fun f g => ⟨ f . down / g . down ⟩⟩
#align ulift.has_div ULift.div
#align ulift.has_sub ULift.sub
@[ to_additive : ∀ {α : Type u} {x y : ULift α } [inst : Sub α ], (x - y ).down = x .down - y .down to_additive ( attr := simp )]
theorem div_down : ∀ [inst : Div α ], (x / y ).down = x .down / y .down div_down [ Div α ] : ( x / y ). down = x . down / y . down :=
rfl : ∀ {α : Sort ?u.1139} {a : α }, a = a rfl
#align ulift.div_down ULift.div_down : ∀ {α : Type u} {x y : ULift α } [inst : Div α ], (x / y ).down = x .down / y .down ULift.div_down
#align ulift.sub_down ULift.sub_down : ∀ {α : Type u} {x y : ULift α } [inst : Sub α ], (x - y ).down = x .down - y .down ULift.sub_down
@[ to_additive ]
instance inv [ Inv α ] : Inv ( ULift : Type ?u.1211 → Type (max?u.1211?u.1212) ULift α ) :=
⟨ fun f => ⟨ f . down ⁻¹⟩⟩
#align ulift.has_inv ULift.inv
#align ulift.has_neg ULift.neg
@[ to_additive : ∀ {α : Type u} {x : ULift α } [inst : Neg α ], (- x ).down = - x .down to_additive ( attr := simp )]
theorem inv_down [ Inv α ] : x ⁻¹. down = x . down ⁻¹ :=
rfl : ∀ {α : Sort ?u.1441} {a : α }, a = a rfl
#align ulift.inv_down ULift.inv_down
#align ulift.neg_down ULift.neg_down : ∀ {α : Type u} {x : ULift α } [inst : Neg α ], (- x ).down = - x .down ULift.neg_down
@[ to_additive ]
instance smul [ SMul : Type ?u.1495 → Type ?u.1494 → Type (max?u.1495?u.1494) SMul α β ] : SMul : Type ?u.1499 → Type ?u.1498 → Type (max?u.1499?u.1498) SMul α ( ULift : Type ?u.1500 → Type (max?u.1500?u.1501) ULift β ) :=
⟨ fun n x => up ( n • x . down )⟩
#align ulift.has_smul ULift.smul
#align ulift.has_vadd ULift.vadd
@[ to_additive : ∀ {α : Type u} {β : Type u_1} [inst : VAdd α β ] (a : α ) (b : ULift β ), (a +ᵥ b ).down = a +ᵥ b .down to_additive ( attr := simp )]
theorem smul_down : ∀ [inst : SMul α β ] (a : α ) (b : ULift β ), (a • b ).down = a • b .down smul_down [ SMul : Type ?u.1778 → Type ?u.1777 → Type (max?u.1778?u.1777) SMul α β ] ( a : α ) ( b : ULift : Type ?u.1783 → Type (max?u.1783v) ULift.{v} β ) : ( a • b ). down = a • b . down :=
rfl : ∀ {α : Sort ?u.1866} {a : α }, a = a rfl
#align ulift.smul_down ULift.smul_down : ∀ {α : Type u} {β : Type u_1} [inst : SMul α β ] (a : α ) (b : ULift β ), (a • b ).down = a • b .down ULift.smul_down
#align ulift.vadd_down ULift.vadd_down : ∀ {α : Type u} {β : Type u_1} [inst : VAdd α β ] (a : α ) (b : ULift β ), (a +ᵥ b ).down = a +ᵥ b .down ULift.vadd_down
@[ to_additive existing ( reorder := 1 2) smul ]
instance pow [ Pow α β ] : Pow ( ULift : Type ?u.1949 → Type (max?u.1949?u.1950) ULift α ) β :=
⟨ fun x n => up ( x . down ^ n )⟩
#align ulift.has_pow ULift.pow
@[ to_additive existing ( attr := simp ) ( reorder := 1 2) smul_down : ∀ {α : Type u} {β : Type u_1} [inst : SMul α β ] (a : α ) (b : ULift β ), (a • b ).down = a • b .down smul_down]
theorem pow_down : ∀ [inst : Pow α β ] (a : ULift α ) (b : β ), (a ^ b ).down = a .down ^ b pow_down [ Pow α β ] ( a : ULift : Type ?u.5196 → Type (max?u.5196v) ULift.{v} α ) ( b : β ) : ( a ^ b ). down = a . down ^ b :=
rfl : ∀ {α : Sort ?u.11319} {a : α }, a = a rfl
#align ulift.pow_down ULift.pow_down : ∀ {α : Type u} {β : Type u_1} [inst : Pow α β ] (a : ULift α ) (b : β ), (a ^ b ).down = a .down ^ b ULift.pow_down
/-- The multiplicative equivalence between `ULift α` and `α`.
-/
@[ to_additive "The additive equivalence between `ULift α` and `α`."]
def _root_.MulEquiv.ulift : [inst : Mul α ] → ULift α ≃* α _root_.MulEquiv.ulift [ Mul α ] : ULift : Type ?u.11386 → Type (max?u.11386?u.11387) ULift α ≃* α :=
{ Equiv.ulift with map_mul' := fun _ _ => rfl : ∀ {α : Sort ?u.11500} {a : α }, a = a rfl }
#align mul_equiv.ulift MulEquiv.ulift
-- porting notes: below failed due to error above, manually added
--@[to_additive]
instance semigroup [ Semigroup : Type ?u.11645 → Type ?u.11645 Semigroup α ] : Semigroup : Type ?u.11648 → Type ?u.11648 Semigroup ( ULift : Type ?u.11649 → Type (max?u.11649?u.11650) ULift α ) :=
( MulEquiv.ulift . injective . semigroup _ ) fun _ _ => rfl : ∀ {α : Sort ?u.11782} {a : α }, a = a rfl
#align ulift.semigroup ULift.semigroup
instance addSemigroup [ AddSemigroup : Type ?u.12234 → Type ?u.12234 AddSemigroup α ] : AddSemigroup : Type ?u.12237 → Type ?u.12237 AddSemigroup ( ULift : Type ?u.12238 → Type (max?u.12238?u.12239) ULift α ) :=
( Equiv.ulift . injective . addSemigroup _ ) fun _ _ => rfl : ∀ {α : Sort ?u.12305} {a : α }, a = a rfl
#align ulift.add_semigroup ULift.addSemigroup
@[ to_additive ]
instance commSemigroup [ CommSemigroup : Type ?u.12555 → Type ?u.12555 CommSemigroup α ] : CommSemigroup : Type ?u.12558 → Type ?u.12558 CommSemigroup ( ULift : Type ?u.12559 → Type (max?u.12559?u.12560) ULift α ) :=
( Equiv.ulift . injective . commSemigroup _ ) fun _ _ => rfl : ∀ {α : Sort ?u.12627} {a : α }, a = a rfl
#align ulift.comm_semigroup ULift.commSemigroup
#align ulift.add_comm_semigroup ULift.addCommSemigroup
@[ to_additive ]
instance mulOneClass [ MulOneClass : Type ?u.13026 → Type ?u.13026 MulOneClass α ] : MulOneClass : Type ?u.13029 → Type ?u.13029 MulOneClass ( ULift : Type ?u.13030 → Type (max?u.13030?u.13031) ULift α ) :=
Equiv.ulift . injective . mulOneClass _ rfl : ∀ {α : Sort ?u.13132} {a : α }, a = a rfl ( by ∀ (x y : ULift α ), ↑Equiv.ulift (x * y ) = ↑Equiv.ulift x * ↑Equiv.ulift y intros ↑Equiv.ulift (x✝ * y✝ ) = ↑Equiv.ulift x✝ * ↑Equiv.ulift y✝ ; ↑Equiv.ulift (x✝ * y✝ ) = ↑Equiv.ulift x✝ * ↑Equiv.ulift y✝ ∀ (x y : ULift α ), ↑Equiv.ulift (x * y ) = ↑Equiv.ulift x * ↑Equiv.ulift y rfl )
#align ulift.mul_one_class ULift.mulOneClass
#align ulift.add_zero_class ULift.addZeroClass
instance mulZeroOneClass [ MulZeroOneClass : Type ?u.13604 → Type ?u.13604 MulZeroOneClass α ] : MulZeroOneClass : Type ?u.13607 → Type ?u.13607 MulZeroOneClass ( ULift : Type ?u.13608 → Type (max?u.13608?u.13609) ULift α ) :=
Equiv.ulift . injective . mulZeroOneClass _ rfl : ∀ {α : Sort ?u.13755} {a : α }, a = a rfl rfl : ∀ {α : Sort ?u.13832} {a : α }, a = a rfl ( by ∀ (a b : ULift α ), ↑Equiv.ulift (a * b ) = ↑Equiv.ulift a * ↑Equiv.ulift b intros ↑Equiv.ulift (a✝ * b✝ ) = ↑Equiv.ulift a✝ * ↑Equiv.ulift b✝ ; ↑Equiv.ulift (a✝ * b✝ ) = ↑Equiv.ulift a✝ * ↑Equiv.ulift b✝ ∀ (a b : ULift α ), ↑Equiv.ulift (a * b ) = ↑Equiv.ulift a * ↑Equiv.ulift b rfl )
#align ulift.mul_zero_one_class ULift.mulZeroOneClass
@[ to_additive ]
instance monoid [ Monoid α ] : Monoid ( ULift : Type ?u.14162 → Type (max?u.14162?u.14163) ULift α ) :=
Equiv.ulift . injective . monoid _ rfl : ∀ {α : Sort ?u.14291} {a : α }, a = a rfl ( fun _ _ => rfl : ∀ {α : Sort ?u.14425} {a : α }, a = a rfl) fun _ _ => rfl : ∀ {α : Sort ?u.14518} {a : α }, a = a rfl
#align ulift.monoid ULift.monoid
#align ulift.add_monoid ULift.addMonoid
@[ to_additive ]
instance commMonoid [ CommMonoid : Type ?u.14795 → Type ?u.14795 CommMonoid α ] : CommMonoid : Type ?u.14798 → Type ?u.14798 CommMonoid ( ULift : Type ?u.14799 → Type (max?u.14799?u.14800) ULift α ) :=
Equiv.ulift . injective . commMonoid _ rfl : ∀ {α : Sort ?u.14925} {a : α }, a = a rfl ( fun _ _ => rfl : ∀ {α : Sort ?u.15117} {a : α }, a = a rfl) fun _ _ => rfl : ∀ {α : Sort ?u.15261} {a : α }, a = a rfl
#align ulift.comm_monoid ULift.commMonoid
#align ulift.add_comm_monoid ULift.addCommMonoid
instance natCast [ NatCast α ] : NatCast ( ULift : Type ?u.15604 → Type (max?u.15604?u.15605) ULift α ) := ⟨λ a ↦ up a ⟩
#align ulift.has_nat_cast ULift.natCast
instance intCast [ IntCast α ] : IntCast ( ULift : Type ?u.15715 → Type (max?u.15715?u.15716) ULift α ) := ⟨λ a ↦ up a ⟩
#align ulift.has_int_cast ULift.intCast
@[ simp , norm_cast ]
theorem up_natCast : ∀ {α : Type u} [inst : NatCast α ] (n : ℕ ), { down := ↑n } = ↑n up_natCast [ NatCast α ] ( n : ℕ ) : up ( n : α ) = n :=
rfl : ∀ {α : Sort ?u.15955} {a : α }, a = a rfl
#align ulift.up_nat_cast ULift.up_natCast : ∀ {α : Type u} [inst : NatCast α ] (n : ℕ ), { down := ↑n } = ↑n ULift.up_natCast
@[ simp , norm_cast ]
theorem up_intCast : ∀ {α : Type u} [inst : IntCast α ] (n : ℤ ), { down := ↑n } = ↑n up_intCast [ IntCast α ] ( n : ℤ ) : up ( n : α ) = n :=
rfl : ∀ {α : Sort ?u.16146} {a : α }, a = a rfl
#align ulift.up_int_cast ULift.up_intCast : ∀ {α : Type u} [inst : IntCast α ] (n : ℤ ), { down := ↑n } = ↑n ULift.up_intCast
@[ simp , norm_cast ]
theorem down_natCast : ∀ {α : Type u} [inst : NatCast α ] (n : ℕ ), (↑n ).down = ↑n down_natCast [ NatCast α ] ( n : ℕ ) : down ( n : ULift : Type ?u.16214 → Type (max?u.16214?u.16215) ULift α ) = n :=
rfl : ∀ {α : Sort ?u.16334} {a : α }, a = a rfl
#align ulift.down_nat_cast ULift.down_natCast : ∀ {α : Type u} [inst : NatCast α ] (n : ℕ ), (↑n ).down = ↑n ULift.down_natCast
@[ simp , norm_cast ]
theorem down_intCast : ∀ {α : Type u} [inst : IntCast α ] (n : ℤ ), (↑n ).down = ↑n down_intCast [ IntCast α ] ( n : ℤ ) : down ( n : ULift : Type ?u.16400 → Type (max?u.16400?u.16401) ULift α ) = n :=
rfl : ∀ {α : Sort ?u.16520} {a : α }, a = a rfl
#align ulift.down_int_cast ULift.down_intCast : ∀ {α : Type u} [inst : IntCast α ] (n : ℤ ), (↑n ).down = ↑n ULift.down_intCast
instance addMonoidWithOne [ AddMonoidWithOne : Type ?u.16576 → Type ?u.16576 AddMonoidWithOne α ] : AddMonoidWithOne : Type ?u.16579 → Type ?u.16579 AddMonoidWithOne ( ULift : Type ?u.16580 → Type (max?u.16580?u.16581) ULift α ) :=
{ ULift.one , ULift.addMonoid with
natCast := fun n => ⟨ n ⟩
natCast_zero := congr_arg : ∀ {α : Sort ?u.16784} {β : Sort ?u.16783} {a₁ a₂ : α } (f : α → β ), a₁ = a₂ → f a₁ = f a₂ congr_arg ULift.up Nat.cast_zero ,
natCast_succ := fun _ => congr_arg : ∀ {α : Sort ?u.16845} {β : Sort ?u.16844} {a₁ a₂ : α } (f : α → β ), a₁ = a₂ → f a₁ = f a₂ congr_arg ULift.up ( Nat.cast_succ _ ) }
#align ulift.add_monoid_with_one ULift.addMonoidWithOne
instance addCommMonoidWithOne [ AddCommMonoidWithOne : Type ?u.17024 → Type ?u.17024 AddCommMonoidWithOne α ] : AddCommMonoidWithOne : Type ?u.17027 → Type ?u.17027 AddCommMonoidWithOne ( ULift : Type ?u.17028 → Type (max?u.17028?u.17029) ULift α ) :=
{ ULift.addMonoidWithOne , ULift.addCommMonoid with }
#align ulift.add_comm_monoid_with_one ULift.addCommMonoidWithOne
instance monoidWithZero [ MonoidWithZero : Type ?u.17247 → Type ?u.17247 MonoidWithZero α ] : MonoidWithZero : Type ?u.17250 → Type ?u.17250 MonoidWithZero ( ULift : Type ?u.17251 → Type (max?u.17251?u.17252) ULift α ) :=
Equiv.ulift . injective . monoidWithZero _ rfl : ∀ {α : Sort ?u.17422} {a : α }, a = a rfl rfl : ∀ {α : Sort ?u.17480} {a : α }, a = a rfl ( fun _ _ => rfl : ∀ {α : Sort ?u.17609} {a : α }, a = a rfl) fun _ _ => rfl : ∀ {α : Sort ?u.17654} {a : α }, a = a rfl
#align ulift.monoid_with_zero ULift.monoidWithZero
instance commMonoidWithZero [ CommMonoidWithZero : Type ?u.17798 → Type ?u.17798 CommMonoidWithZero α ] : CommMonoidWithZero : Type ?u.17801 → Type ?u.17801 CommMonoidWithZero ( ULift : Type ?u.17802 → Type (max?u.17802?u.17803) ULift α ) :=
Equiv.ulift . injective . commMonoidWithZero _ rfl : ∀ {α : Sort ?u.17972} {a : α }, a = a rfl rfl : ∀ {α : Sort ?u.18018} {a : α }, a = a rfl ( fun _ _ => rfl : ∀ {α : Sort ?u.18160} {a : α }, a = a rfl) fun _ _ => rfl : ∀ {α : Sort ?u.18214} {a : α }, a = a rfl
#align ulift.comm_monoid_with_zero ULift.commMonoidWithZero
@[ to_additive ]
instance divInvMonoid [ DivInvMonoid : Type ?u.18368 → Type ?u.18368 DivInvMonoid α ] : DivInvMonoid : Type ?u.18371 → Type ?u.18371 DivInvMonoid ( ULift : Type ?u.18372 → Type (max?u.18372?u.18373) ULift α ) :=
Equiv.ulift . injective . divInvMonoid : {M₁ : Type ?u.18386} →
{M₂ : Type ?u.18385} →
[inst : Mul M₁ ] →
[inst_1 : One M₁ ] →
[inst_2 : Pow M₁ ℕ ] →
[inst_3 : Inv M₁ ] →
[inst_4 : Div M₁ ] →
[inst_5 : Pow M₁ ℤ ] →
[inst_6 : DivInvMonoid M₂ ] →
(f : M₁ → M₂ ) →
Function.Injective f →
f 1 = 1 →
(∀ (x y : M₁ ), f (x * y ) = f x * f y ) →
(∀ (x : M₁ ), f x ⁻¹ = (f x )⁻¹ ) →
(∀ (x y : M₁ ), f (x / y ) = f x / f y ) →
(∀ (x : M₁ ) (n : ℕ ), f (x ^ n ) = f x ^ n ) →
(∀ (x : M₁ ) (n : ℤ ), f (x ^ n ) = f x ^ n ) → DivInvMonoid M₁ divInvMonoid _ rfl : ∀ {α : Sort ?u.18569} {a : α }, a = a rfl ( fun _ _ => rfl : ∀ {α : Sort ?u.18741} {a : α }, a = a rfl) ( fun _ => rfl : ∀ {α : Sort ?u.18831} {a : α }, a = a rfl) ( fun _ _ => rfl : ∀ {α : Sort ?u.18894} {a : α }, a = a rfl)
( fun _ _ => rfl : ∀ {α : Sort ?u.18936} {a : α }, a = a rfl) fun _ _ => rfl : ∀ {α : Sort ?u.19002} {a : α }, a = a rfl
#align ulift.div_inv_monoid ULift.divInvMonoid
#align ulift.sub_neg_add_monoid ULift.subNegAddMonoid
@[ to_additive ]
instance group [ Group α ] : Group ( ULift : Type ?u.19361 → Type (max?u.19361?u.19362) ULift α ) :=
Equiv.ulift . injective . group : {M₁ : Type ?u.19375} →
{M₂ : Type ?u.19374} →
[inst : Mul M₁ ] →
[inst_1 : One M₁ ] →
[inst_2 : Pow M₁ ℕ ] →
[inst_3 : Inv M₁ ] →
[inst_4 : Div M₁ ] →
[inst_5 : Pow M₁ ℤ ] →
[inst_6 : Group M₂ ] →
(f : M₁ → M₂ ) →
Function.Injective f →
f 1 = 1 →
(∀ (x y : M₁ ), f (x * y ) = f x * f y ) →
(∀ (x : M₁ ), f x ⁻¹ = (f x )⁻¹ ) →
(∀ (x y : M₁ ), f (x / y ) = f x / f y ) →
(∀ (x : M₁ ) (n : ℕ ), f (x ^ n ) = f x ^ n ) →
(∀ (x : M₁ ) (n : ℤ ), f (x ^ n ) = f x ^ n ) → Group M₁ group _ rfl : ∀ {α : Sort ?u.19555} {a : α }, a = a rfl ( fun _ _ => rfl : ∀ {α : Sort ?u.19644} {a : α }, a = a rfl) ( fun _ => rfl : ∀ {α : Sort ?u.19751} {a : α }, a = a rfl) ( fun _ _ => rfl : ∀ {α : Sort ?u.19806} {a : α }, a = a rfl)
( fun _ _ => rfl : ∀ {α : Sort ?u.19853} {a : α }, a = a rfl) fun _ _ => rfl : ∀ {α : Sort ?u.19924} {a : α }, a = a rfl
#align ulift.group ULift.group
#align ulift.add_group ULift.addGroup
@[ to_additive ]
instance commGroup [ CommGroup : Type ?u.20273 → Type ?u.20273 CommGroup α ] : CommGroup : Type ?u.20276 → Type ?u.20276 CommGroup ( ULift : Type ?u.20277 → Type (max?u.20277?u.20278) ULift α ) :=
Equiv.ulift . injective . commGroup : {M₁ : Type ?u.20291} →
{M₂ : Type ?u.20290} →
[inst : Mul M₁ ] →
[inst_1 : One M₁ ] →
[inst_2 : Pow M₁ ℕ ] →
[inst_3 : Inv M₁ ] →
[inst_4 : Div M₁ ] →
[inst_5 : Pow M₁ ℤ ] →
[inst_6 : CommGroup M₂ ] →
(f : M₁ → M₂ ) →
Function.Injective f →
f 1 = 1 →
(∀ (x y : M₁ ), f (x * y ) = f x * f y ) →
(∀ (x : M₁ ), f x ⁻¹ = (f x )⁻¹ ) →
(∀ (x y : M₁ ), f (x / y ) = f x / f y ) →
(∀ (x : M₁ ) (n : ℕ ), f (x ^ n ) = f x ^ n ) →
(∀ (x : M₁ ) (n : ℤ ), f (x ^ n ) = f x ^ n ) → CommGroup M₁ commGroup _ rfl : ∀ {α : Sort ?u.20470} {a : α }, a = a rfl ( fun _ _ => rfl : ∀ {α : Sort ?u.20555} {a : α }, a = a rfl) ( fun _ => rfl : ∀ {α : Sort ?u.20666} {a : α }, a = a rfl) ( fun _ _ => rfl : ∀ {α : Sort ?u.20718} {a : α }, a = a rfl)
( fun _ _ => rfl : ∀ {α : Sort ?u.20767} {a : α }, a = a rfl) fun _ _ => rfl : ∀ {α : Sort ?u.20840} {a : α }, a = a rfl
#align ulift.comm_group ULift.commGroup
#align ulift.add_comm_group ULift.addCommGroup
instance addGroupWithOne [ AddGroupWithOne : Type ?u.21193 → Type ?u.21193 AddGroupWithOne α ] : AddGroupWithOne : Type ?u.21196 → Type ?u.21196 AddGroupWithOne ( ULift : Type ?u.21197 → Type (max?u.21197?u.21198) ULift α ) :=
{ ULift.addMonoidWithOne , ULift.addGroup with
intCast := fun n => ⟨ n ⟩,
intCast_ofNat := fun _ => congr_arg : ∀ {α : Sort ?u.21443} {β : Sort ?u.21442} {a₁ a₂ : α } (f : α → β ), a₁ = a₂ → f a₁ = f a₂ congr_arg ULift.up ( Int.cast_ofNat _ ),
intCast_negSucc := fun _ => congr_arg : ∀ {α : Sort ?u.21490} {β : Sort ?u.21489} {a₁ a₂ : α } (f : α → β ), a₁ = a₂ → f a₁ = f a₂ congr_arg ULift.up ( Int.cast_negSucc _ ) }
#align ulift.add_group_with_one ULift.addGroupWithOne
instance addCommGroupWithOne [ AddCommGroupWithOne : Type ?u.21686 → Type ?u.21686 AddCommGroupWithOne α ] : AddCommGroupWithOne : Type ?u.21689 → Type ?u.21689 AddCommGroupWithOne ( ULift : Type ?u.21690 → Type (max?u.21690?u.21691) ULift α ) :=
{ ULift.addGroupWithOne , ULift.addCommGroup with }
#align ulift.add_comm_group_with_one ULift.addCommGroupWithOne
instance groupWithZero [ GroupWithZero : Type ?u.21931 → Type ?u.21931 GroupWithZero α ] : GroupWithZero : Type ?u.21934 → Type ?u.21934 GroupWithZero ( ULift : Type ?u.21935 → Type (max?u.21935?u.21936) ULift α ) :=
Equiv.ulift . injective . groupWithZero : {G₀ : Type ?u.21949} →
{G₀' : Type ?u.21948} →
[inst : GroupWithZero G₀ ] →
[inst_1 : Zero G₀' ] →
[inst_2 : Mul G₀' ] →
[inst_3 : One G₀' ] →
[inst_4 : Inv G₀' ] →
[inst_5 : Div G₀' ] →
[inst_6 : Pow G₀' ℕ ] →
[inst_7 : Pow G₀' ℤ ] →
(f : G₀' → G₀ ) →
Function.Injective f →
f 0 = 0 →
f 1 = 1 →
(∀ (x y : G₀' ), f (x * y ) = f x * f y ) →
(∀ (x : G₀' ), f x ⁻¹ = (f x )⁻¹ ) →
(∀ (x y : G₀' ), f (x / y ) = f x / f y ) →
(∀ (x : G₀' ) (n : ℕ ), f (x ^ n ) = f x ^ n ) →
(∀ (x : G₀' ) (n : ℤ ), f (x ^ n ) = f x ^ n ) → GroupWithZero G₀' groupWithZero _ rfl : ∀ {α : Sort ?u.22175} {a : α }, a = a rfl rfl : ∀ {α : Sort ?u.22236} {a : α }, a = a rfl ( fun _ _ => rfl : ∀ {α : Sort ?u.22368} {a : α }, a = a rfl) ( fun _ => rfl : ∀ {α : Sort ?u.22413} {a : α }, a = a rfl) ( fun _ _ => rfl : ∀ {α : Sort ?u.22448} {a : α }, a = a rfl)
( fun _ _ => rfl : ∀ {α : Sort ?u.22482} {a : α }, a = a rfl) fun _ _ => rfl : ∀ {α : Sort ?u.22527} {a : α }, a = a rfl
#align ulift.group_with_zero ULift.groupWithZero
instance commGroupWithZero [ CommGroupWithZero : Type ?u.22704 → Type ?u.22704 CommGroupWithZero α ] : CommGroupWithZero : Type ?u.22707 → Type ?u.22707 CommGroupWithZero ( ULift : Type ?u.22708 → Type (max?u.22708?u.22709) ULift α ) :=
Equiv.ulift . injective . commGroupWithZero : {G₀ : Type ?u.22722} →
{G₀' : Type ?u.22721} →
[inst : CommGroupWithZero G₀ ] →
[inst_1 : Zero G₀' ] →
[inst_2 : Mul G₀' ] →
[inst_3 : One G₀' ] →
[inst_4 : Inv G₀' ] →
[inst_5 : Div G₀' ] →
[inst_6 : Pow G₀' ℕ ] →
[inst_7 : Pow G₀' ℤ ] →
(f : G₀' → G₀ ) →
Function.Injective f →
f 0 = 0 →
f 1 = 1 →
(∀ (x y : G₀' ), f (x * y ) = f x * f y ) →
(∀ (x : G₀' ), f x ⁻¹ = (f x )⁻¹ ) →
(∀ (x y : G₀' ), f (x / y ) = f x / f y ) →
(∀ (x : G₀' ) (n : ℕ ), f (x ^ n ) = f x ^ n ) →
(∀ (x : G₀' ) (n : ℤ ), f (x ^ n ) = f x ^ n ) → CommGroupWithZero G₀' commGroupWithZero _ rfl : ∀ {α : Sort ?u.22947} {a : α }, a = a rfl rfl : ∀ {α : Sort ?u.22995} {a : α }, a = a rfl ( fun _ _ => rfl : ∀ {α : Sort ?u.23133} {a : α }, a = a rfl) ( fun _ => rfl : ∀ {α : Sort ?u.23180} {a : α }, a = a rfl) ( fun _ _ => rfl : ∀ {α : Sort ?u.23212} {a : α }, a = a rfl)
( fun _ _ => rfl : ∀ {α : Sort ?u.23243} {a : α }, a = a rfl) fun _ _ => rfl : ∀ {α : Sort ?u.23290} {a : α }, a = a rfl
#align ulift.comm_group_with_zero ULift.commGroupWithZero
@[ to_additive ]
instance leftCancelSemigroup [ LeftCancelSemigroup : Type ?u.23471 → Type ?u.23471 LeftCancelSemigroup α ] : LeftCancelSemigroup : Type ?u.23474 → Type ?u.23474 LeftCancelSemigroup ( ULift : Type ?u.23475 → Type (max?u.23475?u.23476) ULift α ) :=
Equiv.ulift . injective . leftCancelSemigroup _ fun _ _ => rfl : ∀ {α : Sort ?u.23542} {a : α }, a = a rfl
#align ulift.left_cancel_semigroup ULift.leftCancelSemigroup
#align ulift.add_left_cancel_semigroup ULift.addLeftCancelSemigroup
@[ to_additive ]
instance rightCancelSemigroup [ RightCancelSemigroup : Type ?u.23933 → Type ?u.23933 RightCancelSemigroup α ] : RightCancelSemigroup : Type ?u.23936 → Type ?u.23936 RightCancelSemigroup ( ULift : Type ?u.23937 → Type (max?u.23937?u.23938) ULift α ) :=
Equiv.ulift . injective . rightCancelSemigroup _ fun _ _ => rfl : ∀ {α : Sort ?u.24004} {a : α }, a = a rfl
#align ulift.right_cancel_semigroup ULift.rightCancelSemigroup
#align ulift.add_right_cancel_semigroup ULift.addRightCancelSemigroup
@[ to_additive ]
instance leftCancelMonoid [ LeftCancelMonoid : Type ?u.24388 → Type ?u.24388 LeftCancelMonoid α ] : LeftCancelMonoid : Type ?u.24391 → Type ?u.24391 LeftCancelMonoid ( ULift : Type ?u.24392 → Type (max?u.24392?u.24393) ULift α ) :=
Equiv.ulift . injective . leftCancelMonoid _ rfl : ∀ {α : Sort ?u.24516} {a : α }, a = a rfl ( fun _ _ => rfl : ∀ {α : Sort ?u.24634} {a : α }, a = a rfl) fun _ _ => rfl : ∀ {α : Sort ?u.24780} {a : α }, a = a rfl
#align ulift.left_cancel_monoid ULift.leftCancelMonoid
#align ulift.add_left_cancel_monoid ULift.addLeftCancelMonoid
@[ to_additive ]
instance rightCancelMonoid [ RightCancelMonoid : Type ?u.25129 → Type ?u.25129 RightCancelMonoid α ] : RightCancelMonoid : Type ?u.25132 → Type ?u.25132 RightCancelMonoid ( ULift : Type ?u.25133 → Type (max?u.25133?u.25134) ULift α ) :=
Equiv.ulift . injective . rightCancelMonoid _ rfl : ∀ {α : Sort ?u.25256} {a : α }, a = a rfl ( fun _ _ => rfl : ∀ {α : Sort ?u.25352} {a : α }, a = a rfl) fun _ _ => rfl : ∀ {α : Sort ?u.25483} {a : α }, a = a rfl
#align ulift.right_cancel_monoid ULift.rightCancelMonoid
#align ulift.add_right_cancel_monoid ULift.addRightCancelMonoid
@[ to_additive ]
instance cancelMonoid [ CancelMonoid : Type ?u.25817 → Type ?u.25817 CancelMonoid α ] : CancelMonoid : Type ?u.25820 → Type ?u.25820 CancelMonoid ( ULift : Type ?u.25821 → Type (max?u.25821?u.25822) ULift α ) :=
Equiv.ulift . injective . cancelMonoid _ rfl : ∀ {α : Sort ?u.25945} {a : α }, a = a rfl ( fun _ _ => rfl : ∀ {α : Sort ?u.26048} {a : α }, a = a rfl) fun _ _ => rfl : ∀ {α : Sort ?u.26183} {a : α }, a = a rfl
#align ulift.cancel_monoid ULift.cancelMonoid
#align ulift.add_cancel_monoid ULift.addCancelMonoid
@[ to_additive ]
instance cancelCommMonoid [ CancelCommMonoid : Type ?u.26497 → Type ?u.26497 CancelCommMonoid α ] : CancelCommMonoid : Type ?u.26500 → Type ?u.26500 CancelCommMonoid ( ULift : Type ?u.26501 → Type (max?u.26501?u.26502) ULift α ) :=
Equiv.ulift . injective . cancelCommMonoid _ rfl : ∀ {α : Sort ?u.26624} {a : α }, a = a rfl ( fun _ _ => rfl : ∀ {α : Sort ?u.26733} {a : α }, a = a rfl) fun _ _ => rfl : ∀ {α : Sort ?u.26873} {a : α }, a = a rfl
#align ulift.cancel_comm_monoid ULift.cancelCommMonoid
#align ulift.add_cancel_comm_monoid ULift.addCancelCommMonoid
instance nontrivial [ Nontrivial α ] : Nontrivial ( ULift : Type ?u.27198 → Type (max?u.27198?u.27199) ULift α ) :=
Equiv.ulift . symm : {α : Sort ?u.27206} → {β : Sort ?u.27205} → α ≃ β → β ≃ α symm. injective . nontrivial
#align ulift.nontrivial ULift.nontrivial
-- TODO we don't do `OrderedCancelCommMonoid` or `OrderedCommGroup`
-- We'd need to add instances for `ULift` in `Order.Basic`.
end ULift