@@ -27,14 +27,54 @@ def additive (α : Type*) := α
27
27
multiplicative structure. -/
28
28
def multiplicative (α : Type *) := α
29
29
30
- instance [inhabited α] : inhabited (additive α) := ⟨(default _ : α)⟩
31
- instance [inhabited α] : inhabited (multiplicative α) := ⟨(default _ : α)⟩
30
+ /-- Reinterpret `x : α` as an element of `additive α`. -/
31
+ def additive.of_mul (x : α) : additive α := x
32
+
33
+ /-- Reinterpret `x : additive α` as an element of `α`. -/
34
+ def additive.to_mul (x : additive α) : α := x
35
+
36
+ lemma of_mul_inj : function.injective (@additive.of_mul α) := λ _ _, id
37
+ lemma to_mul_inj : function.injective (@additive.to_mul α) := λ _ _, id
38
+
39
+ /-- Reinterpret `x : α` as an element of `multiplicative α`. -/
40
+ def multiplicative.of_add (x : α) : multiplicative α := x
41
+
42
+ /-- Reinterpret `x : multiplicative α` as an element of `α`. -/
43
+ def multiplicative.to_add (x : multiplicative α) : α := x
44
+
45
+ lemma of_add_inj : function.injective (@multiplicative.of_add α) := λ _ _, id
46
+ lemma to_add_inj : function.injective (@multiplicative.to_add α) := λ _ _, id
47
+
48
+ @[simp] lemma to_add_of_add (x : α) : (multiplicative.of_add x).to_add = x := rfl
49
+ @[simp] lemma of_add_to_add (x : multiplicative α) : multiplicative.of_add x.to_add = x := rfl
50
+
51
+ @[simp] lemma to_mul_of_mul (x : α) : (additive.of_mul x).to_mul = x := rfl
52
+ @[simp] lemma of_mul_to_mul (x : additive α) : additive.of_mul x.to_mul = x := rfl
53
+
54
+ instance [inhabited α] : inhabited (additive α) := ⟨additive.of_mul (default α)⟩
55
+ instance [inhabited α] : inhabited (multiplicative α) := ⟨multiplicative.of_add (default α)⟩
32
56
33
57
instance additive.has_add [has_mul α] : has_add (additive α) :=
34
- { add := ((*) : α → α → α ) }
58
+ { add := λ x y, additive.of_mul (x.to_mul * y.to_mul ) }
35
59
36
60
instance [has_add α] : has_mul (multiplicative α) :=
37
- { mul := ((+) : α → α → α) }
61
+ { mul := λ x y, multiplicative.of_add (x.to_add + y.to_add) }
62
+
63
+ @[simp] lemma of_add_add [has_add α] (x y : α) :
64
+ multiplicative.of_add (x + y) = multiplicative.of_add x * multiplicative.of_add y :=
65
+ rfl
66
+
67
+ @[simp] lemma to_add_mul [has_add α] (x y : multiplicative α) :
68
+ (x * y).to_add = x.to_add + y.to_add :=
69
+ rfl
70
+
71
+ @[simp] lemma of_mul_mul [has_mul α] (x y : α) :
72
+ additive.of_mul (x * y) = additive.of_mul x + additive.of_mul y :=
73
+ rfl
74
+
75
+ @[simp] lemma to_mul_add [has_mul α] (x y : additive α) :
76
+ (x + y).to_mul = x.to_mul * y.to_mul :=
77
+ rfl
38
78
39
79
instance [semigroup α] : add_semigroup (additive α) :=
40
80
{ add_assoc := @mul_assoc α _,
@@ -68,43 +108,63 @@ instance [add_right_cancel_semigroup α] : right_cancel_semigroup (multiplicativ
68
108
{ mul_right_cancel := @add_right_cancel _ _,
69
109
..multiplicative.semigroup }
70
110
111
+ instance [has_one α] : has_zero (additive α) := ⟨additive.of_mul 1 ⟩
112
+
113
+ @[simp] lemma of_mul_one [has_one α] : @additive.of_mul α 1 = 0 := rfl
114
+
115
+ @[simp] lemma to_mul_zero [has_one α] : (0 : additive α).to_mul = 1 := rfl
116
+
117
+ instance [has_zero α] : has_one (multiplicative α) := ⟨multiplicative.of_add 0 ⟩
118
+
119
+ @[simp] lemma of_add_zero [has_zero α] : @multiplicative.of_add α 0 = 1 := rfl
120
+
121
+ @[simp] lemma to_add_one [has_zero α] : (1 : multiplicative α).to_add = 0 := rfl
122
+
71
123
instance [monoid α] : add_monoid (additive α) :=
72
- { zero := ( 1 : α) ,
124
+ { zero := 0 ,
73
125
zero_add := @one_mul _ _,
74
126
add_zero := @mul_one _ _,
75
127
..additive.add_semigroup }
76
128
77
129
instance [add_monoid α] : monoid (multiplicative α) :=
78
- { one := ( 0 : α) ,
130
+ { one := 1 ,
79
131
one_mul := @zero_add _ _,
80
132
mul_one := @add_zero _ _,
81
133
..multiplicative.semigroup }
82
134
83
135
instance [comm_monoid α] : add_comm_monoid (additive α) :=
84
- { add_comm := @mul_comm α _,
85
- ..additive.add_monoid }
136
+ { .. additive.add_monoid, .. additive.add_comm_semigroup }
86
137
87
138
instance [add_comm_monoid α] : comm_monoid (multiplicative α) :=
88
- { mul_comm := @add_comm α _,
89
- ..multiplicative.monoid }
139
+ { ..multiplicative.monoid, .. multiplicative.comm_semigroup }
140
+
141
+ instance [has_inv α] : has_neg (additive α) := ⟨λ x, multiplicative.of_add x.to_mul⁻¹⟩
142
+
143
+ @[simp] lemma of_mul_inv [has_inv α] (x : α) : additive.of_mul x⁻¹ = -(additive.of_mul x) := rfl
144
+
145
+ @[simp] lemma to_mul_neg [has_inv α] (x : additive α) : (-x).to_mul = x.to_mul⁻¹ := rfl
146
+
147
+ instance [has_neg α] : has_inv (multiplicative α) := ⟨λ x, additive.of_mul (-x.to_add)⟩
148
+
149
+ @[simp] lemma of_add_neg [has_neg α] (x : α) :
150
+ multiplicative.of_add (-x) = (multiplicative.of_add x)⁻¹ := rfl
151
+
152
+ @[simp] lemma to_add_inv [has_neg α] (x : multiplicative α) :
153
+ (x⁻¹).to_add = -x.to_add := rfl
90
154
91
155
instance [group α] : add_group (additive α) :=
92
- { neg := @has_inv.inv α _,
93
- add_left_neg := @mul_left_inv _ _,
94
- ..additive.add_monoid }
156
+ { add_left_neg := @mul_left_inv α _,
157
+ .. additive.has_neg, .. additive.add_monoid }
95
158
96
159
instance [add_group α] : group (multiplicative α) :=
97
- { inv := @has_neg.neg α _,
98
- mul_left_inv := @add_left_neg _ _,
99
- ..multiplicative.monoid }
160
+ { mul_left_inv := @add_left_neg α _,
161
+ .. multiplicative.has_inv, ..multiplicative.monoid }
100
162
101
163
instance [comm_group α] : add_comm_group (additive α) :=
102
- { add_comm := @mul_comm α _,
103
- ..additive.add_group }
164
+ { .. additive.add_group, .. additive.add_comm_monoid }
104
165
105
166
instance [add_comm_group α] : comm_group (multiplicative α) :=
106
- { mul_comm := @add_comm α _,
107
- ..multiplicative.group }
167
+ { .. multiplicative.group, .. multiplicative.comm_monoid }
108
168
109
169
/-- Reinterpret `f : α →+ β` as `multiplicative α →* multiplicative β`. -/
110
170
def add_monoid_hom.to_multiplicative [add_monoid α] [add_monoid β] (f : α →+ β) :
0 commit comments