|
| 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