@@ -32,12 +32,33 @@ run_cmd
32
32
for typeName in [`UInt8, `UInt16, `UInt32, `UInt64, `USize].map Lean.mkIdent do
33
33
Lean.Elab.Command.elabCommand (← `(
34
34
namespace $typeName
35
- instance : Inhabited (Fin size) where
35
+ instance : Inhabited $typeName where
36
36
default := 0
37
37
38
38
instance : Neg $typeName where
39
39
neg a := mk (-a.val)
40
40
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
+
41
62
lemma sub_def (a b : $typeName) : a - b = ⟨a.val - b.val⟩ := rfl
42
63
43
64
lemma mul_def (a b : $typeName) : a * b = ⟨a.val * b.val⟩ := rfl
@@ -46,63 +67,31 @@ run_cmd
46
67
47
68
lemma add_def (a b : $typeName) : a + b = ⟨a.val + b.val⟩ := rfl
48
69
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
+
49
80
lemma eq_of_val_eq : ∀ {a b : $typeName}, a.val = b.val -> a = b
50
81
| ⟨_⟩, ⟨_⟩, h => congrArg mk h
51
82
83
+ lemma val_injective : Function.Injective val := @eq_of_val_eq
84
+
52
85
lemma val_eq_of_eq : ∀ {a b : $typeName}, a = b -> a.val = b.val
53
86
| ⟨_⟩, ⟨_⟩, h => congrArg val h
54
87
55
88
@[simp] lemma mk_val_eq : ∀ (a : $typeName), mk a.val = a
56
89
| ⟨_, _⟩ => rfl
57
90
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)
106
95
107
96
end $typeName
108
97
))
0 commit comments