@@ -100,21 +100,22 @@ end
100
100
101
101
end submodule
102
102
103
- def is_noetherian (α β) [ring α] [add_comm_group β] [module α β] : Prop :=
104
- ∀ (s : submodule α β), s.fg
103
+ class is_noetherian (α β) [ring α] [add_comm_group β] [module α β] : Prop :=
104
+ (noetherian : ∀ (s : submodule α β), s.fg)
105
105
106
106
section
107
107
variables {α : Type *} {β : Type *} {γ : Type *}
108
108
variables [ring α] [add_comm_group β] [add_comm_group γ]
109
109
variables [module α β] [module α γ]
110
+ open is_noetherian
110
111
include α
111
112
112
113
theorem is_noetherian_submodule {N : submodule α β} :
113
114
is_noetherian α N ↔ ∀ s : submodule α β, s ≤ N → s.fg :=
114
- ⟨λ hn s hs, have s ≤ N.subtype.range, from (N.range_subtype).symm ▸ hs,
115
+ ⟨λ ⟨hn⟩, λ s hs, have s ≤ N.subtype.range, from (N.range_subtype).symm ▸ hs,
115
116
linear_map.map_comap_eq_self this ▸ submodule.fg_map (hn _),
116
- λ h s, submodule.fg_of_fg_map_of_fg_inf_ker N.subtype (h _ $ submodule.map_subtype_le _ _) $
117
- by rw [submodule.ker_subtype, inf_bot_eq]; exact submodule.fg_bot⟩
117
+ λ h, ⟨λ s, submodule.fg_of_fg_map_of_fg_inf_ker N.subtype (h _ $ submodule.map_subtype_le _ _) $
118
+ by rw [submodule.ker_subtype, inf_bot_eq]; exact submodule.fg_bot⟩⟩
118
119
119
120
theorem is_noetherian_submodule_left {N : submodule α β} :
120
121
is_noetherian α N ↔ ∀ s : submodule α β, (N ⊓ s).fg :=
@@ -128,29 +129,31 @@ is_noetherian_submodule.trans
128
129
129
130
variable (β)
130
131
theorem is_noetherian_of_surjective (f : β →ₗ[α] γ) (hf : f.range = ⊤)
131
- (hb : is_noetherian α β) : is_noetherian α γ :=
132
- λ s, have (s.comap f).map f = s, from linear_map.map_comap_eq_self $ hf.symm ▸ le_top,
133
- this ▸ submodule.fg_map $ hb _
132
+ [ is_noetherian α β] : is_noetherian α γ :=
133
+ ⟨ λ s, have (s.comap f).map f = s, from linear_map.map_comap_eq_self $ hf.symm ▸ le_top,
134
+ this ▸ submodule.fg_map $ noetherian _⟩
134
135
variable {β}
135
136
136
137
theorem is_noetherian_of_linear_equiv (f : β ≃ₗ[α] γ)
137
- (hb : is_noetherian α β) : is_noetherian α γ :=
138
- is_noetherian_of_surjective _ f.to_linear_map f.range hb
138
+ [ is_noetherian α β] : is_noetherian α γ :=
139
+ is_noetherian_of_surjective _ f.to_linear_map f.range
139
140
140
- theorem is_noetherian_prod (hb : is_noetherian α β)
141
- (hc : is_noetherian α γ) : is_noetherian α (β × γ) :=
142
- λ s, submodule.fg_of_fg_map_of_fg_inf_ker (linear_map.snd α β γ) (hc _) $
141
+ instance is_noetherian_prod [ is_noetherian α β]
142
+ [ is_noetherian α γ] : is_noetherian α (β × γ) :=
143
+ ⟨ λ s, submodule.fg_of_fg_map_of_fg_inf_ker (linear_map.snd α β γ) (noetherian _) $
143
144
have s ⊓ linear_map.ker (linear_map.snd α β γ) ≤ linear_map.range (linear_map.inl α β γ),
144
145
from λ x ⟨hx1, hx2⟩, ⟨x.1 , trivial, prod.ext rfl $ eq.symm $ linear_map.mem_ker.1 hx2⟩,
145
- linear_map.map_comap_eq_self this ▸ submodule.fg_map (hb _)
146
+ linear_map.map_comap_eq_self this ▸ submodule.fg_map (noetherian _)⟩
146
147
147
- theorem is_noetherian_pi {α ι : Type *} {β : ι → Type *} [ring α]
148
+ instance is_noetherian_pi {α ι : Type *} {β : ι → Type *} [ring α]
148
149
[Π i, add_comm_group (β i)] [Π i, module α (β i)] [fintype ι]
149
- (hb : ∀ i, is_noetherian α (β i)) : is_noetherian α (Π i, β i) :=
150
+ [ ∀ i, is_noetherian α (β i)] : is_noetherian α (Π i, β i) :=
150
151
begin
151
152
haveI := classical.dec_eq ι,
152
153
suffices : ∀ s : finset ι, is_noetherian α (Π i : (↑s : set ι), β i),
153
- { refine is_noetherian_of_linear_equiv ⟨_, _, _, _, _, _⟩ (this finset.univ),
154
+ { letI := this finset.univ,
155
+ refine @is_noetherian_of_linear_equiv _ _ _ _ _ _ _ _
156
+ ⟨_, _, _, _, _, _⟩ (this finset.univ),
154
157
{ exact λ f i, f ⟨i, finset.mem_univ _⟩ },
155
158
{ intros, ext, refl },
156
159
{ intros, ext, refl },
@@ -159,9 +162,10 @@ begin
159
162
{ intro, ext i, refl } },
160
163
intro s,
161
164
induction s using finset.induction with a s has ih,
162
- { intro s, convert submodule.fg_bot, apply eq_bot_iff.2 ,
165
+ { split, intro s, convert submodule.fg_bot, apply eq_bot_iff.2 ,
163
166
intros x hx, refine (submodule.mem_bot α).2 _, ext i, cases i.2 },
164
- refine is_noetherian_of_linear_equiv ⟨_, _, _, _, _, _⟩ (is_noetherian_prod (hb a) ih),
167
+ refine @is_noetherian_of_linear_equiv _ _ _ _ _ _ _ _
168
+ ⟨_, _, _, _, _, _⟩ (@is_noetherian_prod _ (β a) _ _ _ _ _ _ _ ih),
165
169
{ exact λ f i, or.by_cases (finset.mem_insert.1 i.2 )
166
170
(λ h : i.1 = a, show β i.1 , from (eq.rec_on h.symm f.1 ))
167
171
(λ h : i.1 ∈ s, show β i.1 , from f.2 ⟨i.1 , h⟩) },
191
195
192
196
end
193
197
198
+ open is_noetherian
199
+
194
200
theorem is_noetherian_iff_well_founded
195
201
{α β} [ring α] [add_comm_group β] [module α β] :
196
202
is_noetherian α β ↔ well_founded ((>) : submodule α β → submodule α β → Prop ) :=
@@ -199,7 +205,8 @@ theorem is_noetherian_iff_well_founded
199
205
swap, { apply is_strict_order.swap },
200
206
rintro ⟨⟨N, hN⟩⟩,
201
207
let M := ⨆ n, N n,
202
- rcases submodule.fg_def.1 (h M) with ⟨t, h₁, h₂⟩,
208
+ resetI,
209
+ rcases submodule.fg_def.1 (noetherian M) with ⟨t, h₁, h₂⟩,
203
210
have hN' : ∀ {a b}, a ≤ b → N a ≤ N b :=
204
211
λ a b, (le_iff_le_of_strict_mono N (λ _ _, hN.1 )).2 ,
205
212
have : t ⊆ ⋃ i, (N i : set β),
@@ -222,7 +229,7 @@ theorem is_noetherian_iff_well_founded
222
229
(le_trans (le_supr _ _) this )
223
230
end ,
224
231
begin
225
- assume h N,
232
+ assume h, split, assume N,
226
233
suffices : ∀ M ≤ N, ∃ s, finite s ∧ M ⊔ submodule.span α s = N,
227
234
{ rcases this ⊥ bot_le with ⟨s, hs, e⟩,
228
235
exact submodule.fg_def.2 ⟨s, hs, by simpa using e⟩ },
@@ -243,16 +250,23 @@ theorem is_noetherian_iff_well_founded
243
250
rw [← hs₂, sup_assoc, ← submodule.span_union], simp }
244
251
end ⟩
245
252
246
- def is_noetherian_ring (α) [ring α] : Prop := is_noetherian α α
253
+ lemma well_founded_submodule_gt {α β} [ring α] [add_comm_group β] [module α β] :
254
+ ∀ [is_noetherian α β], well_founded ((>) : submodule α β → submodule α β → Prop ) :=
255
+ is_noetherian_iff_well_founded.mp
256
+
257
+ @[class] def is_noetherian_ring (α) [ring α] : Prop := is_noetherian α α
258
+
259
+ instance is_noetherian_ring.to_is_noetherian {α : Type *} [ring α] :
260
+ ∀ [is_noetherian_ring α], is_noetherian α α := id
247
261
248
- theorem ring.is_noetherian_of_fintype (R M) [ring R] [add_comm_group M] [module R M] [fintype M] : is_noetherian R M :=
262
+ instance ring.is_noetherian_of_fintype (R M) [ring R] [add_comm_group M] [module R M] [fintype M] : is_noetherian R M :=
249
263
by letI := classical.dec; exact
250
- assume s, ⟨to_finset s, by rw [finset.coe_to_finset', submodule.span_eq]⟩
264
+ ⟨ assume s, ⟨to_finset s, by rw [finset.coe_to_finset', submodule.span_eq]⟩ ⟩
251
265
252
266
theorem ring.is_noetherian_of_zero_eq_one {R} [ring R] (h01 : (0 : R) = 1 ) : is_noetherian_ring R :=
253
267
by haveI := subsingleton_of_zero_eq_one R h01;
254
268
haveI := fintype.of_subsingleton (0 :R);
255
- exact ring.is_noetherian_of_fintype R R
269
+ exact ring.is_noetherian_of_fintype _ _
256
270
257
271
theorem is_noetherian_of_submodule_of_noetherian (R M) [ring R] [add_comm_group M] [module R M] (N : submodule R M)
258
272
(h : is_noetherian R M) : is_noetherian R N :=
@@ -269,13 +283,14 @@ begin
269
283
end
270
284
271
285
theorem is_noetherian_of_fg_of_noetherian {R M} [ring R] [add_comm_group M] [module R M] (N : submodule R M)
272
- (h : is_noetherian_ring R) (hN : N.fg) : is_noetherian R N :=
286
+ [ is_noetherian_ring R] (hN : N.fg) : is_noetherian R N :=
273
287
let ⟨s, hs⟩ := hN in
274
288
begin
275
289
haveI := classical.dec_eq M,
290
+ letI : is_noetherian R R := by apply_instance,
276
291
have : ∀ x ∈ s, x ∈ N, from λ x hx, hs ▸ submodule.subset_span hx,
277
292
refine @@is_noetherian_of_surjective ((↑s : set M) → R) _ _ _ (pi.module _)
278
- _ _ _ ( is_noetherian_pi $ λ _, h) ,
293
+ _ _ _ is_noetherian_pi,
279
294
{ fapply linear_map.mk,
280
295
{ exact λ f, ⟨s.attach.sum (λ i, f i • i.1 ), N.sum_mem (λ c _, N.smul_mem _ $ this _ c.2 )⟩ },
281
296
{ intros f g, apply subtype.eq,
@@ -298,42 +313,42 @@ begin
298
313
end
299
314
300
315
theorem is_noetherian_ring_of_surjective (R) [comm_ring R] (S) [comm_ring S]
301
- (f : R → S) (hf : is_ring_hom f) (hf : function.surjective f)
302
- ( H : is_noetherian_ring R) : is_noetherian_ring S :=
316
+ (f : R → S) [ is_ring_hom f] (hf : function.surjective f)
317
+ [ H : is_noetherian_ring R] : is_noetherian_ring S :=
303
318
begin
304
319
unfold is_noetherian_ring at H ⊢,
305
320
rw is_noetherian_iff_well_founded at H ⊢,
306
321
convert order_embedding.well_founded (order_embedding.rsymm (ideal.lt_order_embedding_of_surjective f hf)) H
307
322
end
308
323
309
- theorem is_noetherian_ring_range {R} [comm_ring R] {S} [comm_ring S] (f : R → S) (hf : is_ring_hom f)
310
- (h : is_noetherian_ring R) : is_noetherian_ring (set.range f) :=
311
- is_noetherian_ring_of_surjective _ _ (λ r, ⟨f r, r, rfl⟩)
312
- ⟨subtype.eq $ is_ring_hom.map_one f, λ x y, subtype.eq $ is_ring_hom.map_mul f, λ x y, subtype.eq $ is_ring_hom.map_add f⟩
313
- (λ ⟨y, r, h⟩, ⟨r, subtype.eq h⟩) h
324
+ instance is_noetherian_ring_range {R} [comm_ring R] {S} [comm_ring S] (f : R → S) [is_ring_hom f]
325
+ [is_noetherian_ring R] : is_noetherian_ring (set.range f) :=
326
+ @is_noetherian_ring_of_surjective R _ (set.range f) _ (λ x, ⟨f x, x, rfl⟩)
327
+ (⟨subtype.eq (is_ring_hom.map_one f),
328
+ λ _ _, subtype.eq (is_ring_hom.map_mul f),
329
+ λ _ _, subtype.eq (is_ring_hom.map_add f)⟩)
330
+ (λ ⟨x, y, hy⟩, ⟨y, subtype.eq hy⟩) _
314
331
315
332
theorem is_noetherian_ring_of_ring_equiv (R) [comm_ring R] {S} [comm_ring S]
316
- (f : R ≃r S) (H : is_noetherian_ring R) : is_noetherian_ring S :=
317
- is_noetherian_ring_of_surjective R S f.1 f.2 f. 1 .bijective.2 H
333
+ (f : R ≃r S) [ is_noetherian_ring R] : is_noetherian_ring S :=
334
+ is_noetherian_ring_of_surjective R S f.1 f.1 .bijective.2
318
335
319
336
namespace is_noetherian_ring
320
337
321
- variables {α : Type *} [integral_domain α] (hα : is_noetherian_ring α)
322
- include hα
338
+ variables {α : Type *} [integral_domain α] [is_noetherian_ring α]
323
339
open associates nat
324
340
325
341
local attribute [elab_as_eliminator] well_founded.fix
326
342
327
343
lemma well_founded_dvd_not_unit : well_founded (λ a b : α, a ≠ 0 ∧ ∃ x, ¬is_unit x ∧ b = a * x ) :=
328
344
by simp only [ideal.span_singleton_lt_span_singleton.symm];
329
- exact inv_image.wf (λ a, ideal.span ({a} : set α))
330
- (is_noetherian_iff_well_founded.1 hα)
345
+ exact inv_image.wf (λ a, ideal.span ({a} : set α)) well_founded_submodule_gt
331
346
332
347
lemma exists_irreducible_factor {a : α} (ha : ¬ is_unit a) (ha0 : a ≠ 0 ) :
333
348
∃ i, irreducible i ∧ i ∣ a :=
334
349
(irreducible_or_factor a ha).elim (λ hai, ⟨a, hai, dvd_refl _⟩)
335
350
(well_founded.fix
336
- ( well_founded_dvd_not_unit hα)
351
+ well_founded_dvd_not_unit
337
352
(λ a ih ha ha0 ⟨x, y, hx, hy, hxy⟩,
338
353
have hx0 : x ≠ 0 , from λ hx0, ha0 (by rw [← hxy, hx0, zero_mul]),
339
354
(irreducible_or_factor x hx).elim
@@ -346,18 +361,18 @@ lemma exists_irreducible_factor {a : α} (ha : ¬ is_unit a) (ha0 : a ≠ 0) :
346
361
(hi : ∀ a i : α, a ≠ 0 → irreducible i → P a → P (i * a)) :
347
362
P a :=
348
363
by haveI := classical.dec; exact
349
- well_founded.fix ( well_founded_dvd_not_unit hα)
364
+ well_founded.fix well_founded_dvd_not_unit
350
365
(λ a ih, if ha0 : a = 0 then ha0.symm ▸ h0
351
366
else if hau : is_unit a then hu a hau
352
- else let ⟨i, hii, ⟨b, hb⟩⟩ := exists_irreducible_factor hα hau ha0 in
367
+ else let ⟨i, hii, ⟨b, hb⟩⟩ := exists_irreducible_factor hau ha0 in
353
368
have hb0 : b ≠ 0 , from λ hb0, by simp * at *,
354
369
hb.symm ▸ hi _ _ hb0 hii (ih _ ⟨hb0, i,
355
370
hii.1 , by rw [hb, mul_comm]⟩))
356
371
a
357
372
358
373
lemma exists_factors (a : α) : a ≠ 0 →
359
374
∃f:multiset α, (∀b∈f, irreducible b) ∧ associated a f.prod :=
360
- is_noetherian_ring.irreducible_induction_on hα a
375
+ is_noetherian_ring.irreducible_induction_on a
361
376
(λ h, (h rfl).elim)
362
377
(λ u hu _, ⟨0 , by simp [associated_one_iff_is_unit, hu]⟩)
363
378
(λ a i ha0 hii ih hia0,
0 commit comments