Zulip Chat Archive

Stream: new members

Topic: Raymond


Patrick Massot (Feb 07 2019 at 20:26):

I see a new mathematician online here! Hi Raymond!

Kevin Buzzard (Feb 07 2019 at 21:11):

A number theorist, no less!

Patrick Massot (Feb 07 2019 at 21:12):

Sébastien, we really need to find how to attract more geometers...

Sebastien Gouezel (Feb 07 2019 at 21:49):

First we have to define manifolds and tangent bundles and de Rham cohomology.

Patrick Massot (Feb 07 2019 at 21:51):

I know... But, before you came here, I was the only geometer, so I started perfectoid spaces with Kevin and Johan instead. And now I teach 13 hours per week until April :exhausted:

Jan-David Salchow (Feb 07 2019 at 23:23):

+1 for manifolds

Kevin Buzzard (Feb 08 2019 at 00:29):

I think manifolds is a wonderful goal.

Kenny Lau (Feb 08 2019 at 00:55):

I thought @Patrick Massot warned us against manifolds

Kevin Buzzard (Feb 08 2019 at 00:57):

He just said it was interesting how much work there was in the details which he usually left to the students

Johan Commelin (Feb 08 2019 at 07:12):

Hoi @Raymond. Je bent ineens heel populair (-; :thumbs_up:

Patrick Massot (Feb 08 2019 at 08:02):

I thought Patrick Massot warned us against manifolds

I said we should do manifolds, but it's slightly more complicated than you may think. But really we should be finishing stuff, especially when we announced them everywhere. So I won't work on manifolds until perfectoid spaces are done. In the mean time, everybody is welcome to do calculus which is ridiculously missing and will block manifolds anyway.

Raymond (Feb 08 2019 at 08:57):

Hi all! I started learning lean after @David Holmes told me it was fun, and I am going through these problems on Kevin's website now. It still feels like a lot of trial-and-error, but I am slowly getting used to this.

Kevin Buzzard (Feb 08 2019 at 09:02):

I wrote those problems in about 5 seconds flat and I'm sure they're completely unbalanced. There is a certain art to it all. I have some time for Lean now but there are about 10 things I want to do, and making good teaching materials is one of them, but currently everything is a bit haphazard.

David Holmes (Feb 08 2019 at 13:50):

Hi @Raymond, nice to see you! I forgot I used the word `fun'... Actually, it was really fun after I got through the logic puzzles (a => b stuff). It was constructing the natural and the complex numbers that I really liked. I should play with this again...

Kevin Buzzard (Feb 08 2019 at 13:52):

I just spent an hour with a joint maths/computing student building group cohomology from scratch. We got as far as H^0 but she was just a learner so we went slowly.

import algebra.module

class G_module (G : Type*) [group G] (M : Type*)
  extends add_comm_group M, has_scalar G M :=
(id :  m : M, (1 : G)  m = m)
(mul :  g h : G,  m : M, g  (h  m) = (g * h)  m)
(linear :  g : G,  m n : M, g  (m + n) = g  m + g  n)

definition H0 (G : Type*) [group G] (M : Type*) [G_module G M]
:= {m : M //  g : G, g  m = m}

variables (G : Type*) [group G] (M : Type*) [G_module G M]

variables {G} {M}

lemma g_zero (g : G) : g  (0 : M) = 0 :=
begin
  have h : 0 + g  (0 : M) = g  0 + g  0,
    calc
    0 + g  (0 : M) = g  0 : zero_add _
    ...             = g  (0 + 0) : by rw [add_zero (0 : M)]
    ...         = g  0 + g  0 : G_module.linear g 0 0,
   symmetry,
   exact add_right_cancel h
end

lemma g_neg (g : G) (m : M) : g  (-m) = -(g m) :=
begin
  apply eq_neg_of_add_eq_zero,
  rw G_module.linear,
  rw neg_add_self,
  exact g_zero g
end

theorem H0.add_closed (m n : M)
  (hm :  g : G, g  m = m) (hn :  g : G, g  n = n) :
 g : G, g  (m + n) = m + n :=
begin
  intro g,
  rw G_module.linear,
  rw hm,
  rw hn,
end

definition H0.add_comm_group : add_comm_group (H0 G M) :=
{ add := λ x y, x.1 + y.1, H0.add_closed x.1 y.1 x.2 y.2,
  add_assoc := λ a b c, subtype.eq (add_assoc _ _ _),
  /- begin
    intros a b c,
    apply subtype.eq,
--    show a.val + b.val + c.val = a.val + (b.val + c.val),
    exact add_assoc _ _ _
  end ,-/
  zero := 0,g_zero,
  zero_add := λ a, subtype.eq (zero_add _),
  add_zero := λ a, subtype.eq (add_zero _),
  neg := λ x, ⟨-x.1, λ g, by rw [g_neg g x.1, x.2],
  add_left_neg := λ a, subtype.eq (add_left_neg _),
  add_comm := λ a b, subtype.eq (add_comm _ _)}

variables {N : Type*} [G_module G N]

variable (G)

definition G_module_hom (f : M  N) : Prop :=
 g : G,  m : M, f (g  m) = g  (f m)

lemma H0.G_module_hom (f : M  N) (h : G_module_hom G f) (g : G) (m : M)
(hm :  g : G, g  m = m):
g  f m = f m :=
begin
  rw h,
  rw hm g,
end

def H0_f (f : M  N) (hf : G_module_hom G f) : H0 G M  H0 G N :=
λ x, f x.1, λ g, H0.G_module_hom G f hf g x.1 x.2

lemma id.G_module_hom : G_module_hom G (id : M  M) :=
λ g m, rfl
/-begin
  intro g,
  intro m,
  refl,
end
-/

Kevin Buzzard (Feb 08 2019 at 13:54):

It just feels like the machine is holding your hand and nothing can go wrong. And what's really stupid is that for all I know, this is the first time, or perhaps one of the first times, people have done group cohomology in this formal proof setting. A lot of existing code in these systems is not this sort of masters level algebra.

Kevin Buzzard (Feb 08 2019 at 13:55):

@Kenny Lau I think all my lemmas and definitions are named very poorly.

Kevin Buzzard (Feb 08 2019 at 13:56):

I know the proofs are golfable but I realised that I couldn't really think of good lemma names on my feet and I didn't want to stop and start browsing through similar constructions because of time pressure

Kevin Buzzard (Feb 08 2019 at 13:57):

@David Holmes Kenny did H^1 for his 1st year project: https://github.com/kckennylau/local-langlands-abelian/blob/master/src/group_cohomology.lean -- as part of his work on formalising the local Langlands conjectures

Raymond (Feb 08 2019 at 16:50):

Hi @Raymond, nice to see you! I forgot I used the word `fun'... Actually, it was really fun after I got through the logic puzzles (a => b stuff). It was constructing the natural and the complex numbers that I really liked. I should play with this again...

O well, that was just my interpretation of what you were telling me.

The thing which confuses me a bit now are what things simp does and does not simplify. For my complex numbers some equalities are just the usual properties for the reals, but it sometimes does not recognise this as such.

Kevin Buzzard (Feb 08 2019 at 17:20):

Using simp is an art, and making it work with new structures that you make is even more than an art. It's a large database of results of the form A = B and P <-> Q, with the left hand side "more complicated" than the right hand side. The strategy, of course, is that if simp spots anything in the goal which is deemed "more complicated", it replaces it with the "less complicated" thing, and keeps going until it either gets stuck or ends up with something of the form X = X, in which case it proves it using reflexivity of equality :-) If you make a new thing, then you should make some "simp lemmas" (by proving them and tagging them with @[simp]) and you want to prove just the right things to take the argument in the direction you want it to go.

Kevin Buzzard (Feb 08 2019 at 17:20):

I don't think I understood simp well until I understood definitional equality.

Kenny Lau (Feb 08 2019 at 19:48):

import algebra.module group_theory.subgroup

class group_module (G : Type*) [group G] (M : Type*) [add_comm_group M] extends has_scalar G M :=
(one_smul :  m : M, (1 : G)  m = m)
(smul_smul :  g h : G,  m : M, g  (h  m) = (g * h)  m)
(smul_add :  g : G,  m n : M, g  (m + n) = g  m + g  n)

namespace group_module

variables {G : Type*} [group G] {M : Type*} [add_comm_group M] [group_module G M]

variables (M)
instance is_add_group_hom_smul (g : G) : is_add_group_hom (() g : M  M) :=
group_module.smul_add g

lemma smul_zero (g : G) : g  (0 : M) = 0 :=
is_add_group_hom.zero _
variables {M}

lemma smul_neg (g : G) (m : M) : g  (-m) = -(g  m) :=
is_add_group_hom.neg _ _

definition fixed_points (G : Type*) [group G] (M : Type*) [add_comm_group M] [group_module G M] : set M :=
{m : M |  g : G, g  m = m}

instance fixed_points.is_add_subgroup : is_add_subgroup (fixed_points G M) :=
{ add_mem := λ m n hm hn g, by rw [smul_add, hm g, hn g],
  zero_mem := smul_zero M,
  neg_mem := λ m hm g, by rw [smul_neg, hm g] }

definition H0 (G : Type*) [group G] (M : Type*) [add_comm_group M] [group_module G M] :=
fixed_points G M

instance H0.add_comm_group : add_comm_group (H0 G M) :=
{ add_comm := λ m n, subtype.eq $ add_comm _ _,
  .. @subtype.add_group _ _ _ fixed_points.is_add_subgroup }

end group_module

variables {G : Type*} [group G] {M : Type*} [add_comm_group M] [group_module G M]
variables {N : Type*} [add_comm_group N] [group_module G N]

variable (G)

def is_group_module_hom (f : M  N) : Prop :=
 g : G,  m : M, f (g  m) = g  (f m)

namespace is_group_module_hom
open group_module

def map_H0 (f : M  N) (hf : is_group_module_hom G f) (x : H0 G M) : H0 G N :=
f x.1, λ g, by rw [ hf, x.2]

lemma id.group_module_hom : is_group_module_hom G (id : M  M) :=
λ g m, rfl

end is_group_module_hom

Kenny Lau (Feb 08 2019 at 19:48):

@Kevin Buzzard your file has been Kenny'd

Kevin Buzzard (Feb 08 2019 at 20:26):

@Anca Ciobanu Above is a version which is much harder to understand :-)


Last updated: Dec 20 2023 at 11:08 UTC