/
universal_map.lean
511 lines (425 loc) Β· 19.1 KB
/
universal_map.lean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
import linear_algebra.matrix
import group_theory.free_abelian_group
import algebra.direct_sum
import algebra.big_operators.finsupp
import for_mathlib.free_abelian_group
-- import for_mathlib.kronecker
import data.matrix.kronecker
import hacks_and_tricks.type_pow
import hacks_and_tricks.by_exactI_hack
/-!
# Breen-Deligne resolutions
Reference:
https://www.math.uni-bonn.de/people/scholze/Condensed.pdf#section*.4
("Appendix to Lecture IV", p. 28)
We formalize the notion of `breen_deligne_data`.
Roughly speaking, this is a collection of formal finite sums of matrices
that encode that data that rolls out of the Breen--Deligne resolution.
## Main definitions
- `breen_deligne.basic_universal_map` : the map corresponding to a matrix
- `breen_deligne.universal_map` : a formal linear combination of basic universal maps.
-/
noncomputable theory
-- get some notation working:
open_locale big_operators direct_sum kronecker
local attribute [instance] type_pow
local notation `β€[` A `]` := free_abelian_group A
namespace breen_deligne
open free_abelian_group
/-!
Suppose you have an abelian group `A`.
What data do you need to specify a "universal" map `f : β€[A^m] β β€[A^n]`?
That is, it should be functorial in `A`.
Well, such a map is specified by what it does to `(a 1, a 2, a 3, ..., a m)`.
It can send this element to an arbitrary element of `β€[A^n]`,
but it has to be "universal".
In the end, this means that `f` will be a `β€`-linear combination of
"basic universal maps", where a "basic universal map" is one that
sends `(a 1, a 2, ..., a m)` to `(b 1, ..., b n)`,
where `b i` is a `β€`-linear combination `c i 1 * a 1 + ... + c i m * a m`.
So a "basic universal map" is specified by the `n Γ m`-matrix `c`.
-/
/-- A `basic_universal_map m n` is an `n Γ m`-matrix.
It captures data for a homomorphism `β€[A^m] β β€[A^n]`
functorial in the abelian group `A`.
A general such homomorphism is a formal linear combination
of `basic_universal_map`s, which we aptly call `universal_map`s. -/
@[derive add_comm_group]
def basic_universal_map (m n : β) := matrix (fin n) (fin m) β€
namespace basic_universal_map
variables (A : Type*) [add_comm_group A]
variables {k l m n : β} (g : basic_universal_map m n) (f : basic_universal_map l m)
def pre_eval : basic_universal_map m n β+ A^m β A^n :=
add_monoid_hom.mk' (Ξ» f x i, β j, f i j β’ (x : fin _ β A) j)
begin
intros fβ fβ,
ext x i,
simp only [pi.add_apply, dmatrix.add_apply, add_smul, finset.sum_add_distrib],
end
lemma pre_eval_apply : pre_eval A g = Ξ» x i, β j, g i j β’ (x : fin _ β A) j := rfl
/-- `f.eval A` for a `f : basic_universal_map m n`
is the homomorphism `β€[A^m] β+ β€[A^n]` induced by matrix multiplication. -/
def eval : β€[A^m] β+ β€[A^n] :=
map $ pre_eval A g
lemma eval_of (x : A^m) :
g.eval A (of x) = (of $ pre_eval A g x) :=
lift.of _ _
/-- The composition of basic universal maps,
defined as matrix multiplication. -/
def comp : basic_universal_map m n β+ basic_universal_map l m β+ basic_universal_map l n :=
add_monoid_hom.mk' (Ξ» g, add_monoid_hom.mk' (Ξ» f, matrix.mul g f) $ matrix.mul_add _) $
Ξ» gβ gβ, by { ext1 f, apply matrix.add_mul }
lemma eval_comp : (comp g f).eval A = (g.eval A).comp (f.eval A) :=
begin
ext1 x,
simp only [add_monoid_hom.coe_comp, function.comp_app, eval_of, pre_eval, comp, finset.smul_sum,
matrix.mul_apply, finset.sum_smul, mul_smul, add_monoid_hom.mk'_apply],
congr' 1,
ext1 i,
exact finset.sum_comm
end
lemma comp_assoc
(h : basic_universal_map m n) (g : basic_universal_map l m) (f : basic_universal_map k l) :
comp (comp h g) f = comp h (comp g f) :=
matrix.mul_assoc h g f
/-- The identity `basic_universal_map`. -/
def id (n : β) : basic_universal_map n n := (1 : matrix (fin n) (fin n) β€)
@[simp] lemma id_comp : comp (id _) f = f :=
matrix.one_mul f
@[simp] lemma comp_id : comp g (id _) = g :=
matrix.mul_one g
def mul (N : β) : basic_universal_map m n β+ basic_universal_map (N * m) (N * n) :=
add_monoid_hom.mk'
(Ξ» f, matrix.reindex_linear_equiv β _ fin_prod_fin_equiv fin_prod_fin_equiv (1 ββ f))
begin
intros f g,
simp only [matrix.kronecker_add, matrix.reindex_linear_equiv_apply,
matrix.reindex_apply, matrix.minor_add, dmatrix.add_apply],
end
lemma mul_apply (N : β) (f : basic_universal_map m n) :
mul N f = matrix.reindex_linear_equiv β _ fin_prod_fin_equiv fin_prod_fin_equiv (1 ββ f) :=
rfl
lemma mul_injective (N : β) (hN : 0 < N) : function.injective (@mul m n N) :=
begin
intros f g H,
ext i j,
rw function.funext_iff at H,
specialize H (fin_prod_fin_equiv (β¨0, hNβ©, i)),
rw function.funext_iff at H,
specialize H (fin_prod_fin_equiv (β¨0, hNβ©, j)),
dsimp [basic_universal_map.mul, matrix.kronecker] at H,
simpa only [one_mul, equiv.symm_apply_apply, matrix.one_apply_eq] using H,
end
lemma mul_comp (N : β) (g : basic_universal_map m n) (f : basic_universal_map l m) :
mul N (comp g f) = comp (mul N g) (mul N f) :=
begin
ext1 i j,
dsimp only [mul, comp, add_monoid_hom.mk'_apply],
rw [β matrix.reindex_linear_equiv_mul, β matrix.mul_kronecker_mul, matrix.one_mul],
end
def one_mul_hom (n) : basic_universal_map (1 * n) n :=
matrix.reindex_linear_equiv β _
((fin_one_equiv.prod_congr $ equiv.refl _).trans $ equiv.punit_prod _)
fin_prod_fin_equiv
(1 : matrix (fin 1 Γ fin n) _ β€)
def one_mul_inv (n) : basic_universal_map n (1 * n) :=
matrix.reindex_linear_equiv β _
fin_prod_fin_equiv
((fin_one_equiv.prod_congr $ equiv.refl _).trans $ equiv.punit_prod _)
(1 : matrix (fin 1 Γ fin n) _ β€)
lemma one_mul_hom_inv : comp (one_mul_hom n) (one_mul_inv n) = id n :=
begin
dsimp only [comp, one_mul_hom, one_mul_inv, add_monoid_hom.mk'_apply, id],
rw [β matrix.reindex_linear_equiv_mul, matrix.one_mul, matrix.reindex_linear_equiv_one],
end
lemma one_mul_inv_hom : comp (one_mul_inv n) (one_mul_hom n) = id _ :=
begin
dsimp only [comp, one_mul_hom, one_mul_inv, add_monoid_hom.mk'_apply, id],
rw [β matrix.reindex_linear_equiv_mul, matrix.one_mul, matrix.reindex_linear_equiv_one],
end
def mul_mul_hom (m n i : β) : basic_universal_map (m * (n * i)) ((m * n) * i) :=
matrix.reindex_linear_equiv β _
(((equiv.refl _).prod_congr fin_prod_fin_equiv.symm).trans $
(equiv.prod_assoc _ _ _).symm.trans $ (fin_prod_fin_equiv.prod_congr $ equiv.refl _).trans
fin_prod_fin_equiv)
fin_prod_fin_equiv
(1 : matrix (fin m Γ fin (n * i)) (fin m Γ fin (n * i)) β€)
def mul_mul_inv (m n i : β) : basic_universal_map ((m * n) * i) (m * (n * i)) :=
matrix.reindex_linear_equiv β _
fin_prod_fin_equiv
(((equiv.refl _).prod_congr fin_prod_fin_equiv.symm).trans $
(equiv.prod_assoc _ _ _).symm.trans $ (fin_prod_fin_equiv.prod_congr $ equiv.refl _).trans
fin_prod_fin_equiv)
(1 : matrix (fin m Γ fin (n * i)) (fin m Γ fin (n * i)) β€)
lemma mul_mul_hom_inv {m n i : β} : comp (mul_mul_hom m n i) (mul_mul_inv m n i) = id _ :=
begin
dsimp only [comp, mul_mul_hom, mul_mul_inv, add_monoid_hom.mk'_apply, id],
rw [β matrix.reindex_linear_equiv_mul, matrix.one_mul, matrix.reindex_linear_equiv_one],
end
lemma mul_mul_inv_hom {m n i : β} : comp (mul_mul_inv m n i) (mul_mul_hom m n i) = id _ :=
begin
dsimp only [comp, mul_mul_hom, mul_mul_inv, add_monoid_hom.mk'_apply, id],
rw [β matrix.reindex_linear_equiv_mul, matrix.one_mul, matrix.reindex_linear_equiv_one],
end
def proj_aux {N : β} (k : fin N) : matrix punit.{1} (fin N) β€ :=
Ξ» i j, if j = k then 1 else 0
def proj (n : β) {N : β} (k : fin N) : basic_universal_map (N * n) n :=
matrix.reindex_linear_equiv β _ (equiv.punit_prod _) fin_prod_fin_equiv $
(proj_aux k) ββ 1
lemma proj_comp_mul {N : β} (k : fin N) (f : basic_universal_map m n) :
comp (proj n k) (mul N f) = comp f (proj m k) :=
begin
dsimp only [comp, proj, mul, add_monoid_hom.mk'_apply],
have : f = (matrix.reindex_linear_equiv
β _ (equiv.punit_prod (fin n)) (equiv.punit_prod (fin m)))
((1 : matrix punit.{1} punit.{1} β€) ββ f),
{ ext i j,
simp only [matrix.reindex_linear_equiv_apply, matrix.reindex_apply, matrix.minor_apply,
equiv.punit_prod_symm_apply, matrix.kronecker, matrix.kronecker_apply,
matrix.one_apply_eq, one_mul] },
conv_rhs { rw this },
rw [β matrix.reindex_linear_equiv_mul, β matrix.reindex_linear_equiv_mul],
simp only [βmatrix.mul_kronecker_mul, matrix.kronecker, matrix.mul_one, matrix.one_mul],
end
lemma one_mul_hom_eq_proj : basic_universal_map.one_mul_hom n = basic_universal_map.proj n 0 :=
begin
dsimp only [basic_universal_map.one_mul_hom, basic_universal_map.proj],
rw [β linear_equiv.symm_apply_eq, matrix.reindex_linear_equiv_symm,
matrix.reindex_linear_equiv_comp_apply, equiv.trans_symm, equiv.trans_assoc,
equiv.trans_symm, equiv.trans_refl],
ext β¨i, i'β© β¨j, j'β© : 2,
change fin 1 at j,
dsimp only [matrix.reindex_linear_equiv_apply, matrix.kronecker],
dsimp [fin_one_equiv, equiv.prod_congr_left, basic_universal_map.proj_aux],
simp only [matrix.one_apply, prod.mk.inj_iff, @eq_comm _ _ j],
simp only [true_and, mul_boole, if_true, prod.mk.inj_iff,
eq_self_iff_true, eq_iff_true_of_subsingleton],
convert rfl
end
.
lemma proj_aux_kronecker_proj_aux (a :fin m) (b : fin n) :
(proj_aux a) ββ (proj_aux b) =
matrix.reindex_linear_equiv β _ (equiv.prod_punit _).symm fin_prod_fin_equiv.symm
(proj_aux (fin_prod_fin_equiv (a,b))) :=
begin
ext β¨i, i'β© β¨j, j'β© : 2,
dsimp [matrix.reindex_linear_equiv_apply, matrix.kronecker, proj_aux],
simp only [equiv.apply_eq_iff_eq, boole_mul, prod.mk.inj_iff],
symmetry,
convert ite_and
end
lemma comp_proj_mul_proj (n N : β) (j : fin (2 * 2 ^ N)) :
(comp (proj n ((fin_prod_fin_equiv.symm) j).fst)) (mul 2 (proj n ((fin_prod_fin_equiv.symm) j).snd)) =
(comp (proj n j)) (mul_mul_hom 2 (2 ^ N) n) :=
begin
dsimp only [mul_mul_hom, proj, comp, mul_apply, add_monoid_hom.mk'_apply],
sorry,
-- rw [β matrix.reindex_linear_equiv_mul, β matrix.mul_kronecker_mul, matrix.one_mul,
-- matrix.kronecker_reindex_right, matrix.mul_one,
-- matrix.kronecker_assoc', matrix.mul_reindex_linear_equiv_one, proj_aux_kronecker_proj_aux,
-- matrix.kronecker_reindex_left],
-- simp only [matrix.reindex_linear_equiv_comp_apply],
-- congr' 2,
-- ext β¨x, yβ©,
-- dsimp,
-- simp only [equiv.symm_apply_apply],
-- rw [prod.mk.eta, equiv.apply_symm_apply],
end
end basic_universal_map
/-- A `universal_map m n` is a formal `β€`-linear combination
of `basic_universal_map`s.
It captures the data for a homomorphism `β€[A^m] β β€[A^n]`. -/
@[derive add_comm_group]
def universal_map (m n : β) := β€[basic_universal_map m n]
namespace universal_map
universe variable u
variables {k l m n : β} (g : universal_map m n) (f : universal_map l m)
variables (A : Type u) [add_comm_group A]
/-- `f.eval A` for a `f : universal_map m n`
is the homomorphism `β€[A^m] β+ β€[A^n]` induced by matrix multiplication
of the summands occurring in the formal linear combination `f`. -/
def eval : universal_map m n β+ β€[A^m] β+ β€[A^n] :=
free_abelian_group.lift $ Ξ» (f : basic_universal_map m n), f.eval A
@[simp] lemma eval_of (f : basic_universal_map m n) :
eval A (of f) = f.eval A :=
lift.of _ _
/-- The composition of `universal_map`s `g` and `f`,
given by the formal linear combination of all compositions
of summands occurring in `g` and `f`. -/
def comp : universal_map m n β+ universal_map l m β+ universal_map l n :=
free_abelian_group.lift $ Ξ» (g : basic_universal_map m n), free_abelian_group.lift $ Ξ» f,
of $ basic_universal_map.comp g f
@[simp] lemma comp_of (g : basic_universal_map m n) (f : basic_universal_map l m) :
comp (of g) (of f) = of (basic_universal_map.comp g f) :=
by rw [comp, lift.of, lift.of]
section
open add_monoid_hom
lemma eval_comp : eval A (comp g f) = (eval A g).comp (eval A f) :=
show comp_hom (comp_hom (@eval l n A _)) (comp) g f =
comp_hom (comp_hom (comp_hom.flip (@eval l m A _)) (comp_hom)) (@eval m n A _) g f,
begin
congr' 2, clear f g, ext g f : 2,
show eval A (comp (of g) (of f)) = (eval A (of g)).comp (eval A (of f)),
simp only [basic_universal_map.eval_comp, comp_of, eval_of]
end
lemma comp_assoc (h : universal_map m n) (g : universal_map l m) (f : universal_map k l) :
comp (comp h g) f = comp h (comp g f) :=
show comp_hom (comp_hom (@comp k l n)) (@comp l m n) h g f =
comp_hom (comp_hom (comp_hom.flip (@comp k l m)) (comp_hom)) (@comp k m n) h g f,
begin
congr' 3, clear h g f, ext h g f : 3,
show comp (comp (of h) (of g)) (of f) = comp (of h) (comp (of g) (of f)),
simp only [basic_universal_map.comp_assoc, comp_of]
end
/-- The identity `universal_map`. -/
def id (n : β) : universal_map n n := of (basic_universal_map.id n)
@[simp] lemma id_comp : comp (id _) f = f :=
show comp (id _) f = add_monoid_hom.id _ f,
begin
congr' 1, clear f, ext1 f,
simp only [id, comp_of, id_apply, basic_universal_map.id_comp]
end
@[simp] lemma comp_id : comp g (id _) = g :=
show (@comp m m n).flip (id _) g = add_monoid_hom.id _ g,
begin
congr' 1, clear g, ext1 g,
show comp (of g) (id _) = (of g),
simp only [id, comp_of, id_apply, basic_universal_map.comp_id]
end
def bound : β := β g in f.support, (free_abelian_group.coeff g f).nat_abs
def bound_by (N : β) : Prop := f.bound β€ N
lemma of_bound_by (f : basic_universal_map m n) : bound_by (of f) 1 :=
begin
simp only [bound_by, bound, coeff_of_self, int.nat_abs_one, finset.sum_singleton, support_of],
end
lemma zero_bound_by (N : β) : (0 : universal_map m n).bound_by N :=
by simp only [bound_by, bound, zero_le', finset.sum_const_zero,
add_monoid_hom.map_zero, int.nat_abs_zero]
lemma zero_bound_by_zero : (0 : universal_map m n).bound_by 0 :=
zero_bound_by _
lemma bound_by.random_index {f : universal_map m n} {N : β}
(hf : f.bound_by N) (s : finset (basic_universal_map m n)) :
β g in s, (free_abelian_group.coeff g f).nat_abs β€ N :=
begin
calc β g in s, (free_abelian_group.coeff g f).nat_abs
= β g in s β© f.support, (free_abelian_group.coeff g f).nat_abs +
β g in s \ f.support, (free_abelian_group.coeff g f).nat_abs : _
... = β g in s β© f.support, (free_abelian_group.coeff g f).nat_abs : _
... β€ β g in f.support β© s, (free_abelian_group.coeff g f).nat_abs +
β g in f.support \ s, (free_abelian_group.coeff g f).nat_abs : _
... β€ β g in f.support, (free_abelian_group.coeff g f).nat_abs : _
... β€ N : hf,
{ rw finset.sum_inter_add_sum_diff },
{ simp only [and_imp, add_right_eq_self, int.nat_abs_eq_zero, imp_self, imp_true_iff,
finset.mem_sdiff, finset.sum_eq_zero_iff, free_abelian_group.not_mem_support_iff] },
{ rw finset.inter_comm, simp only [le_add_iff_nonneg_right, zero_le'], },
{ rw finset.sum_inter_add_sum_diff },
end
lemma bound_by.add {fβ fβ : universal_map m n} {Nβ Nβ : β}
(hβ : fβ.bound_by Nβ) (hβ : fβ.bound_by Nβ) :
(fβ + fβ).bound_by (Nβ + Nβ) :=
begin
calc (fβ + fβ).bound β€
β (g : basic_universal_map m n) in support (fβ + fβ),
((coeff g fβ).nat_abs + (coeff g fβ).nat_abs) : finset.sum_le_sum _
... β€ Nβ + Nβ : _,
{ intros g hg,
rw add_monoid_hom.map_add,
apply int.nat_abs_add_le },
{ rw finset.sum_add_distrib,
exact add_le_add (hβ.random_index _) (hβ.random_index _) }
end
lemma bound_by_sum {ΞΉ : Type*} (s : finset ΞΉ) (f : ΞΉ β universal_map m n) (N : ΞΉ β β)
(h : β i β s, (f i).bound_by (N i)) :
(β i in s, f i).bound_by (β i in s, N i) :=
begin
classical,
revert h,
apply finset.induction_on s; clear s,
{ simp only [finset.not_mem_empty, forall_false_left, finset.sum_empty,
implies_true_iff, forall_true_left],
exact zero_bound_by_zero },
{ intros i s his IH h,
simp only [finset.sum_insert his],
exact (h i $ s.mem_insert_self i).add (IH $ Ξ» j hj, h j $ finset.mem_insert_of_mem hj) }
end
end
section mul
open add_monoid_hom
/-
TODO: refactor `mul` to be a functor
TODO: put a monoidal structure on `FreeMat`, so that this is just `N β _`.
-/
def mul (N : β) : universal_map m n β+ universal_map (N * m) (N * n) :=
map (basic_universal_map.mul N)
lemma mul_of (N : β) (f : basic_universal_map m n) :
mul N (of f) = of (basic_universal_map.mul N f) :=
map_of_apply _
lemma mul_comp (N : β) (g : universal_map m n) (f : universal_map l m) :
mul N (comp g f) = comp (mul N g) (mul N f) :=
begin
simp only [β add_monoid_hom.comp_apply],
rw [β add_monoid_hom.comp_hom_apply_apply, β add_monoid_hom.comp_hom_apply_apply,
β add_monoid_hom.comp_hom_apply_apply,
β add_monoid_hom.flip_apply _ _ (mul N)],
simp only [β add_monoid_hom.comp_apply],
rw [β add_monoid_hom.comp_hom_apply_apply, β add_monoid_hom.comp_hom_apply_apply],
congr' 2, clear f g, ext g f,
show (mul N) ((comp (of g)) (of f)) = (comp ((mul N) (of g))) ((mul N) (of f)),
simp only [comp_of, mul_of, basic_universal_map.mul_comp],
end
lemma mem_support_mul (N : β) (hN : 0 < N) (f : universal_map m n) (g) :
g β (mul N f).support β β g', g' β f.support β§ g = basic_universal_map.mul N g' :=
begin
apply free_abelian_group.mem_support_map,
exact basic_universal_map.mul_injective N hN
end
@[simp]
lemma coeff_mul (N : β) (hN : 0 < N) (f : universal_map m n) (g : basic_universal_map m n) :
coeff (basic_universal_map.mul N g) (mul N f) = coeff g f :=
begin
simp only [β add_monoid_hom.comp_apply],
rw [β add_monoid_hom.comp_hom_apply_apply],
congr' 1, clear f, ext f,
simp only [comp_hom_apply_apply, function.comp_app, coe_comp, mul, coeff, to_finsupp_of,
map_of_apply, finsupp.apply_add_hom_apply, finsupp.single_apply,
(basic_universal_map.mul_injective N hN).eq_iff],
convert rfl
end
end mul
/-
TODO: refactor `sum` and `proj` to be natural transformations from `mul n` to `π _`.
-/
def sum (n N : β) : universal_map (N * n) n :=
of (β i, basic_universal_map.proj n i)
def proj (n N : β) : universal_map (N * n) n :=
β i, of (basic_universal_map.proj n i)
lemma sum_comp_mul (N : β) (f : universal_map m n) :
comp (sum n N) (mul N f) = comp f (sum m N) :=
begin
simp only [β add_monoid_hom.comp_apply],
rw [β add_monoid_hom.comp_hom_apply_apply, β add_monoid_hom.flip_apply _ _ (sum m N)],
simp only [β add_monoid_hom.comp_apply],
congr' 1, clear f, ext f,
show (comp (sum n N)) ((mul N) (of f)) = (comp (of f)) (sum m N),
simp only [sum, mul_of, comp_of, add_monoid_hom.map_sum,
add_monoid_hom.finset_sum_apply, basic_universal_map.proj_comp_mul],
end
lemma proj_comp_mul (N : β) (f : universal_map m n) :
comp (proj n N) (mul N f) = comp f (proj m N) :=
begin
simp only [β add_monoid_hom.comp_apply],
rw [β add_monoid_hom.comp_hom_apply_apply, β add_monoid_hom.flip_apply _ _ (proj m N)],
simp only [β add_monoid_hom.comp_apply],
congr' 1, clear f, ext f,
show (comp (proj n N)) ((mul N) (of f)) = (comp (of f)) (proj m N),
simp only [proj, mul_of, comp_of, add_monoid_hom.map_sum,
add_monoid_hom.finset_sum_apply, basic_universal_map.proj_comp_mul],
end
.
lemma proj_bound_by (n N : β) : (proj n N).bound_by N :=
le_trans (bound_by_sum _ _ _ $ Ξ» i _, of_bound_by _) $
by simp only [finset.card_fin, mul_one, algebra.id.smul_eq_mul, finset.sum_const]
end universal_map
end breen_deligne
-- #lint- only unused_arguments def_lemma doc_blame