Zulip Chat Archive

Stream: Is there code for X?

Topic: Finite dimensional vector space over a finite field


Patrick Lutz (Jul 29 2020 at 19:30):

I suspect this is not in mathlib, but I would love to be wrong: does mathlib already have some theorem to the effect that a finite dimensional vector space over a finite field is finite?

Johan Commelin (Jul 29 2020 at 19:30):

I think so

Johan Commelin (Jul 29 2020 at 19:31):

vector_space.card_fintype?

Patrick Lutz (Jul 29 2020 at 19:33):

It looks to me like to use that theorem you have to already know that the vector space V is fintype. Or am I missing something?

Patrick Lutz (Jul 29 2020 at 19:35):

Oh wait, nevermind

Patrick Lutz (Jul 29 2020 at 19:35):

module.fintype_of_fintype takes care of it

Patrick Lutz (Jul 29 2020 at 22:49):

The reason I wanted to know this was to show that a finite extension of a finite field is finite. I proved it like this

import linear_algebra.finite_dimensional

open finite_dimensional

noncomputable lemma finite_of_findim_over_finite (F : Type*) (E : Type*) [field F] [field E]
    [algebra F E] [fintype F] (hE : finite_dimensional F E) : fintype E :=
begin
    set s := classical.some (exists_is_basis_finite F E) with hs,
    have hs' := classical.some_spec (exists_is_basis_finite F E),
    rw  hs at hs',
    cases hs' with s_basis s_finite,
    have s_fintype : fintype s := set.finite.fintype s_finite,
    exact @module.fintype_of_fintype s F E (coe : s  E) _ _ _ s_fintype s_basis _,
end

but that feels a little gruesome. It feels like this should be something I can do in one line using module.fintype_of_fintype (and I believe it is, but I am just too inexperienced at Lean to see how). And does it really need to be uncomputable (I guess probably, since apparently module.fintype_of_fintype is)?

So, does anyone know how to make this proof totally trivial?

Aaron Anderson (Jul 30 2020 at 02:02):

This is what I did on the branch finite_fields_exist

variables {K : Type*} [field K] [fintype K]
variables {V : Type*} [add_comm_group V] [vector_space K V]

noncomputable def fintype_of_finite_dimensional [finite_dimensional K V] : fintype V :=
begin
  have b := classical.some_spec (finite_dimensional.exists_is_basis_finset K V),
  apply module.fintype_of_fintype b,
end

Patrick Lutz (Jul 30 2020 at 18:07):

@Aaron Anderson why did you make it a def rather than a lemma?

Patrick Lutz (Jul 30 2020 at 18:12):

Also, why does what you did work, but the following doesn't?

variables {K : Type*} [field K] [fintype K]
variables {V : Type*} [add_comm_group V] [vector_space K V]

noncomputable def fintype_of_finite_dimensional [finite_dimensional K V] : fintype V :=
begin
  apply module.fintype_of_fintype (classical.some_spec (finite_dimensional.exists_is_basis_finset K V)),
end

Aaron Anderson (Jul 30 2020 at 18:12):

Because fintype is data, not a prop. I might be totally wrong about that convention though, let me check the library.

Aaron Anderson (Jul 30 2020 at 18:14):

Yeah, it looks like that’s standard.

Aaron Anderson (Jul 30 2020 at 18:15):

I don’t recall what error I got shortening it... I bet it can be golfed somehow, maybe even term mode

Patrick Lutz (Jul 30 2020 at 18:17):

This is the error

type mismatch at application
  classical.some_spec (exists_is_basis_finset K V)
term
  exists_is_basis_finset K V
has type
   (b : finset V), is_basis K coe
but is expected to have type
   (x : module ?m_1 ?m_2), is_basis ?m_1 ?m_6

Patrick Lutz (Jul 30 2020 at 18:17):

It's not able to do some type inference I guess

Patrick Lutz (Jul 30 2020 at 18:17):

but what I don't understand is why it could do it in your proof but not in this one

Patrick Lutz (Jul 30 2020 at 18:18):

And I ran into somewhat similar problems which is why my proof above is more complicated than I wanted

Markus Himmel (Jul 30 2020 at 18:20):

The following works:

noncomputable def fintype_of_finite_dimensional [finite_dimensional K V] : fintype V :=
module.fintype_of_fintype (classical.some_spec (finite_dimensional.exists_is_basis_finset K V) : _)

Patrick Lutz (Jul 30 2020 at 18:21):

@Markus Himmel interesting. So in your proof you're explicitly giving lean a hint about how to do type inference? Or am I still confused?

Markus Himmel (Jul 30 2020 at 18:22):

I actually have no idea but it might be related to this?

Patrick Lutz (Jul 30 2020 at 18:23):

So (t : _) is used to tell Lean to not be too aggressive about premature type inference?

Markus Himmel (Jul 30 2020 at 18:24):

I think it somehow says to Lean "do not look at what this is being applied to". By doing the have line first in the tactic proof, you achieve a similar effect.

Patrick Lutz (Jul 30 2020 at 18:25):

I'm not sure I understand what you mean by "do not look at what this is being applied to"

Patrick Lutz (Jul 30 2020 at 18:25):

Shouldn't looking at what it's being applied to help Lean to make the correct type inference?

Markus Himmel (Jul 30 2020 at 18:25):

I don't think I understand either, to be honest.

Kevin Buzzard (Jul 30 2020 at 18:28):

You're making type unification happen in a different order

Markus Himmel (Jul 30 2020 at 18:30):

Should it be obvious that the order matters?

Patrick Lutz (Jul 30 2020 at 18:31):

Kevin Buzzard said:

You're making type unification happen in a different order

Sure, I understand this. But why does (t : _) give me the order I want? I guess the basic issue is that I don't know what the usual order is or how this syntax changes it.


Last updated: Dec 20 2023 at 11:08 UTC