Skip to content

Commit cc47ebb

Browse files
committed
refactor: change defeqs of pow and zsmul on UInt, golf the ring instance (#2567)
This now makes these operators have the obvious defeq WRT the underlying `Fin size`, rather than compute things iteratively.
1 parent 2980665 commit cc47ebb

File tree

1 file changed

+38
-49
lines changed

1 file changed

+38
-49
lines changed

Mathlib/Data/UInt.lean

Lines changed: 38 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,33 @@ run_cmd
3232
for typeName in [`UInt8, `UInt16, `UInt32, `UInt64, `USize].map Lean.mkIdent do
3333
Lean.Elab.Command.elabCommand (← `(
3434
namespace $typeName
35-
instance : Inhabited (Fin size) where
35+
instance : Inhabited $typeName where
3636
default := 0
3737

3838
instance : Neg $typeName where
3939
neg a := mk (-a.val)
4040

41+
instance : Pow $typeName ℕ where
42+
pow a n := mk (a.val ^ n)
43+
44+
instance : SMul ℕ $typeName where
45+
smul n a := mk (n • a.val)
46+
47+
instance : SMul ℤ $typeName where
48+
smul z a := mk (z • a.val)
49+
50+
instance : NatCast $typeName where
51+
natCast n := mk n
52+
53+
instance : IntCast $typeName where
54+
intCast z := mk z
55+
56+
lemma zero_def : (0 : $typeName) = ⟨0⟩ := rfl
57+
58+
lemma one_def : (1 : $typeName) = ⟨1⟩ := rfl
59+
60+
lemma neg_def (a : $typeName) : -a = ⟨-a.val⟩ := rfl
61+
4162
lemma sub_def (a b : $typeName) : a - b = ⟨a.val - b.val⟩ := rfl
4263

4364
lemma mul_def (a b : $typeName) : a * b = ⟨a.val * b.val⟩ := rfl
@@ -46,63 +67,31 @@ run_cmd
4667

4768
lemma add_def (a b : $typeName) : a + b = ⟨a.val + b.val⟩ := rfl
4869

70+
lemma pow_def (a : $typeName) (n : ℕ) : a ^ n = ⟨a.val ^ n⟩ := rfl
71+
72+
lemma nsmul_def (n : ℕ) (a : $typeName) : n • a = ⟨n • a.val⟩ := rfl
73+
74+
lemma zsmul_def (z : ℤ) (a : $typeName) : z • a = ⟨z • a.val⟩ := rfl
75+
76+
lemma natCast_def (n : ℕ) : (n : $typeName) = ⟨n⟩ := rfl
77+
78+
lemma intCast_def (z : ℤ) : (z : $typeName) = ⟨z⟩ := rfl
79+
4980
lemma eq_of_val_eq : ∀ {a b : $typeName}, a.val = b.val -> a = b
5081
| ⟨_⟩, ⟨_⟩, h => congrArg mk h
5182

83+
lemma val_injective : Function.Injective val := @eq_of_val_eq
84+
5285
lemma val_eq_of_eq : ∀ {a b : $typeName}, a = b -> a.val = b.val
5386
| ⟨_⟩, ⟨_⟩, h => congrArg val h
5487

5588
@[simp] lemma mk_val_eq : ∀ (a : $typeName), mk a.val = a
5689
| ⟨_, _⟩ => rfl
5790

58-
lemma zero_def : (0 : $typeName) = ⟨0⟩ := rfl
59-
60-
lemma neg_def (a : $typeName) : -a = ⟨-a.val⟩ := rfl
61-
62-
lemma one_def : (1 : $typeName) = ⟨1⟩ := rfl
63-
64-
instance : AddSemigroup $typeName where
65-
add_assoc _ _ _ := congrArg mk (add_assoc _ _ _)
66-
67-
instance : AddCommSemigroup $typeName where
68-
add_comm _ _ := congrArg mk (add_comm _ _)
69-
70-
instance : Semigroup $typeName where
71-
mul_assoc _ _ _ := congrArg mk (mul_assoc _ _ _)
72-
73-
instance : Semiring $typeName where
74-
add_zero _ := congrArg mk (add_zero _)
75-
zero_add _ := congrArg mk (zero_add _)
76-
add_comm _ _:= congrArg mk (add_comm _ _)
77-
mul_one _ := congrArg mk (mul_one _)
78-
one_mul _ := congrArg mk (one_mul _)
79-
nsmul n a := ⟨AddMonoid.nsmul n a.val⟩
80-
nsmul_zero x := congrArg mk (AddMonoid.nsmul_zero x.val)
81-
nsmul_succ n a := congrArg mk (AddMonoid.nsmul_succ n a.val)
82-
zero_mul _ := congrArg mk (zero_mul _)
83-
mul_zero _ := congrArg mk (mul_zero _)
84-
npow_zero := fun _ ↦ rfl
85-
npow_succ := fun _ _ ↦ rfl
86-
right_distrib a b c := congrArg mk (right_distrib _ _ _)
87-
left_distrib a b c := congrArg mk (left_distrib _ _ _)
88-
natCast n := ⟨n⟩
89-
natCast_zero := rfl
90-
natCast_succ _ := congrArg mk (Nat.cast_succ _)
91-
__ := inferInstanceAs (AddCommSemigroup $typeName)
92-
__ := inferInstanceAs (Semigroup $typeName)
93-
94-
instance : Ring $typeName where
95-
sub_eq_add_neg _ _ := congrArg mk (sub_eq_add_neg _ _)
96-
add_left_neg _ := congrArg mk (add_left_neg _)
97-
intCast n := ⟨n⟩
98-
intCast_ofNat _ := rfl
99-
intCast_negSucc _ := rfl
100-
101-
instance : CommRing $typeName where
102-
mul_comm := fun _ _ ↦ by
103-
apply eq_of_val_eq
104-
simp [mul_def, zero_def]
105-
exact mul_comm _ _
91+
instance : CommRing $typeName :=
92+
Function.Injective.commRing val val_injective
93+
rfl rfl (fun _ _ => rfl) (fun _ _ => rfl) (fun _ => rfl) (fun _ _ => rfl)
94+
(fun _ _ => rfl) (fun _ _ => rfl) (fun _ _ => rfl) (fun _ => rfl) (fun _ => rfl)
10695

10796
end $typeName
10897
))

0 commit comments

Comments
 (0)