Files
elementarGeometrie/ElementarGeometrie/Projective/Space.lean
Stefan Kebekus b20e936d11
Some checks failed
Lean Action CI / build (push) Has been cancelled
Working
2026-06-24 13:46:07 +02:00

124 lines
5.7 KiB
Lean4
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
Copyright (c) 2026 Stefan Kebekus. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Stefan Kebekus
-/
import Mathlib.LinearAlgebra.FiniteDimensional.Lemmas
import Mathlib.LinearAlgebra.Projectivization.Subspace
import ElementarGeometrie.Incidence.Basic
/-!
# Projective spaces as incidence geometries
Following Soergel's notes, the *projectivization* ` K V` of a vector space `V`
over a division ring `K` carries a natural structure of an incidence geometry: its
points are the one-dimensional subspaces of `V`, and its *projective lines* are
the sets of one-dimensional subspaces contained in a fixed two-dimensional
subspace.
We reuse Mathlib's `Projectivization K V` (notation ` K V`) and equip it with an
`IncidenceGeometry` structure, proving the two incidence axioms.
## Main definitions
* `IncidenceGeometry.projectiveLines` : the system of projective lines.
* `IncidenceGeometry.projectivization` : ` K V` as an incidence geometry.
-/
universe u
open scoped LinearAlgebra.Projectivization
namespace IncidenceGeometry
variable (K V : Type u) [DivisionRing K] [AddCommGroup V] [Module K V]
/-- The system of **projective lines** in ` K V`: the sets of points whose
underlying one-dimensional subspace is contained in a fixed two-dimensional
subspace `W` of `V`. -/
def projectiveLines : Set (Set ( K V)) :=
{g | W : Submodule K V, Module.finrank K W = 2
g = {p : K V | p.submodule W}}
variable {K V}
/-- Distinct projective points have distinct underlying one-dimensional
subspaces. -/
theorem submodule_ne_of_ne {x y : K V} (h : x y) :
x.submodule y.submodule :=
fun he => h (Projectivization.submodule_injective he)
/-- The subspace spanned by two distinct projective points is two-dimensional. -/
theorem finrank_sup_submodule {x y : K V} (h : x y) :
Module.finrank K (x.submodule y.submodule : Submodule K V) = 2 := by
haveI : FiniteDimensional K x.submodule :=
Module.finite_of_finrank_eq_succ x.finrank_submodule
haveI : FiniteDimensional K y.submodule :=
Module.finite_of_finrank_eq_succ y.finrank_submodule
have hinf : Module.finrank K (x.submodule y.submodule : Submodule K V) = 0 := by
by_contra hne
have hle : Module.finrank K (x.submodule y.submodule : Submodule K V) 1 := by
have := Submodule.finrank_mono (inf_le_left : x.submodule y.submodule x.submodule)
rwa [x.finrank_submodule] at this
have h1 : Module.finrank K (x.submodule y.submodule : Submodule K V) = 1 :=
le_antisymm hle (Nat.one_le_iff_ne_zero.2 hne)
have hx : x.submodule y.submodule = x.submodule :=
Submodule.eq_of_le_of_finrank_eq inf_le_left (by rw [h1, x.finrank_submodule])
have hy : x.submodule y.submodule = y.submodule :=
Submodule.eq_of_le_of_finrank_eq inf_le_right (by rw [h1, y.finrank_submodule])
exact submodule_ne_of_ne h (hx.symm.trans hy)
have hsum := Submodule.finrank_sup_add_finrank_inf_eq x.submodule y.submodule
rw [hinf, x.finrank_submodule, y.finrank_submodule] at hsum
omega
variable (K V) in
/-- The **projectivization** ` K V` as an incidence geometry: points are the
one-dimensional subspaces of `V` and lines are the projective lines. -/
noncomputable def projectivization : IncidenceGeometry ( K V) where
lines := projectiveLines K V
two_points := by
rintro g W, hW, rfl
-- `W` is two-dimensional, hence nonzero: pick a nonzero `v ∈ W`.
have hWne : W := by
rintro rfl; rw [finrank_bot] at hW; exact absurd hW (by norm_num)
obtain v, hvW, hv := Submodule.exists_mem_ne_zero_of_ne_bot hWne
-- The line `K ∙ v` is properly contained in `W`, so we find `w ∈ W \ K ∙ v`.
have hsub : (K v) W := (Submodule.span_singleton_le_iff_mem _ _).2 hvW
have hne : (K v) W := by
intro he
have hfr : Module.finrank K (K v) = 1 := finrank_span_singleton (K := K) hv
rw [he, hW] at hfr; exact absurd hfr (by norm_num)
obtain w, hwW, hwv := SetLike.exists_of_lt (lt_of_le_of_ne hsub hne)
have hw : w 0 := fun h => hwv (h Submodule.zero_mem _)
refine Projectivization.mk K v hv, Projectivization.mk K w hw, ?_, ?_, ?_
· -- the two points are distinct, as their subspaces `K ∙ v ≠ K ∙ w` differ
intro he
apply hwv
have : (Projectivization.mk K w hw).submodule = (Projectivization.mk K v hv).submodule :=
congrArg Projectivization.submodule he.symm
rw [Projectivization.submodule_mk, Projectivization.submodule_mk] at this
rw [ this]; exact Submodule.mem_span_singleton_self w
· change (Projectivization.mk K v hv).submodule W
rw [Projectivization.submodule_mk]; exact hsub
· change (Projectivization.mk K w hw).submodule W
rw [Projectivization.submodule_mk]
exact (Submodule.span_singleton_le_iff_mem _ _).2 hwW
unique_line := by
intro x y hxy
-- The unique line is the one given by `W = x.submodule ⊔ y.submodule`.
refine {p : K V | p.submodule x.submodule y.submodule},
_, finrank_sup_submodule hxy, rfl, ?_, ?_, ?_
· change x.submodule x.submodule y.submodule
exact le_sup_left
· change y.submodule x.submodule y.submodule
exact le_sup_right
rintro g W', hW', rfl, hxg, hyg
-- Any line through `x` and `y` has direction containing `W`, hence equal to it.
have hle : x.submodule y.submodule W' := sup_le hxg hyg
haveI : FiniteDimensional K W' := Module.finite_of_finrank_eq_succ (n := 1) hW'
have : x.submodule y.submodule = W' :=
Submodule.eq_of_le_of_finrank_eq hle (by rw [finrank_sup_submodule hxy, hW'])
rw [this]
end IncidenceGeometry