207 lines
9.4 KiB
Lean4
207 lines
9.4 KiB
Lean4
/-
|
||
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.Dual.Lemmas
|
||
import ElementarGeometrie.Projective.Space
|
||
|
||
/-!
|
||
# Incidence structures and point-line duality
|
||
|
||
Following Soergel's notes, an **incidence structure** is a datum `(X, G, I)`
|
||
consisting of two sets `X` (points) and `G` (lines) together with an *incidence
|
||
relation* `I ⊆ X × G`. We model `I` as a relation `incident : X → G → Prop`.
|
||
|
||
Every incidence geometry gives rise to an incidence structure, and every incidence
|
||
structure has a *dual*, obtained by exchanging the roles of points and lines. The
|
||
central result is the **point-line duality** for a three-dimensional vector space:
|
||
the incidence structure of `ℙ(V*)` is isomorphic to the dual of the incidence
|
||
structure of `ℙ(V)`.
|
||
|
||
## Main definitions
|
||
|
||
* `IncidenceStructure` : two sets with an incidence relation.
|
||
* `IncidenceStructure.Dual` : the dual incidence structure.
|
||
* `IncidenceStructure.Isomorphic` : isomorphism of incidence structures.
|
||
* `IncidenceGeometry.toIncidenceStructure` : the incidence structure of a geometry.
|
||
-/
|
||
|
||
universe u v w
|
||
|
||
/-- An **incidence structure** consists of a type of points `P`, a type of lines
|
||
`L`, and an incidence relation between them. -/
|
||
structure IncidenceStructure (P : Type u) (L : Type v) where
|
||
/-- The incidence relation: `incident x g` means "`x` lies on `g`". -/
|
||
incident : P → L → Prop
|
||
|
||
namespace IncidenceStructure
|
||
|
||
variable {P : Type u} {L : Type v} {P' : Type*} {L' : Type*}
|
||
|
||
/-- The **dual** incidence structure, with the roles of points and lines
|
||
exchanged. -/
|
||
def Dual (S : IncidenceStructure P L) : IncidenceStructure L P where
|
||
incident g x := S.incident x g
|
||
|
||
@[simp]
|
||
theorem dual_incident (S : IncidenceStructure P L) (g : L) (x : P) :
|
||
S.Dual.incident g x ↔ S.incident x g := Iff.rfl
|
||
|
||
@[simp]
|
||
theorem dual_dual (S : IncidenceStructure P L) : S.Dual.Dual = S := rfl
|
||
|
||
/-- A pair of bijections `(φ, ψ)` is an **isomorphism of incidence structures** if
|
||
it preserves the incidence relation. -/
|
||
def IsIso (S : IncidenceStructure P L) (S' : IncidenceStructure P' L')
|
||
(φ : P ≃ P') (ψ : L ≃ L') : Prop :=
|
||
∀ x g, S.incident x g ↔ S'.incident (φ x) (ψ g)
|
||
|
||
/-- Two incidence structures are **isomorphic** if there is an isomorphism between
|
||
them. -/
|
||
def Isomorphic (S : IncidenceStructure P L) (S' : IncidenceStructure P' L') : Prop :=
|
||
∃ (φ : P ≃ P') (ψ : L ≃ L'), IsIso S S' φ ψ
|
||
|
||
end IncidenceStructure
|
||
|
||
namespace IncidenceGeometry
|
||
|
||
variable {X : Type u}
|
||
|
||
/-- The incidence structure associated with an incidence geometry: points are the
|
||
points of `X`, lines are the lines of `G`, and incidence is set membership. -/
|
||
def toIncidenceStructure (G : IncidenceGeometry X) :
|
||
IncidenceStructure X {g : Set X // g ∈ G.lines} where
|
||
incident x g := x ∈ g.val
|
||
|
||
open scoped LinearAlgebra.Projectivization
|
||
|
||
section Duality
|
||
|
||
variable {K : Type u} [Field K]
|
||
|
||
/-- A projective line, as a set of points, determines its underlying subspace:
|
||
the subspaces are recovered as the directions of the points lying on the line. -/
|
||
theorem projLine_inj {U : Type u} [AddCommGroup U] [Module K U] {W W' : Submodule K U}
|
||
(hWW' : {p : ℙ K U | p.submodule ≤ W} = {p : ℙ K U | p.submodule ≤ W'}) : W = W' := by
|
||
have key : ∀ {A B : Submodule K U},
|
||
{p : ℙ K U | p.submodule ≤ A} ⊆ {p | p.submodule ≤ B} → A ≤ B := by
|
||
intro A B hsub w hw
|
||
by_cases hw0 : w = 0
|
||
· rw [hw0]; exact B.zero_mem
|
||
· have hmem : Projectivization.mk K w hw0 ∈ {p : ℙ K U | p.submodule ≤ B} :=
|
||
hsub (by
|
||
simp only [Set.mem_setOf_eq, Projectivization.submodule_mk]
|
||
exact (Submodule.span_singleton_le_iff_mem _ _).2 hw)
|
||
rw [Set.mem_setOf_eq, Projectivization.submodule_mk,
|
||
Submodule.span_singleton_le_iff_mem] at hmem
|
||
exact hmem
|
||
exact le_antisymm (key hWW'.le) (key hWW'.ge)
|
||
|
||
/-- The projective lines of `ℙ K U`, as sets of points, are in bijection with the
|
||
two-dimensional subspaces of `U`. -/
|
||
noncomputable def projLineEquiv (U : Type u) [AddCommGroup U] [Module K U] :
|
||
{g : Set (ℙ K U) // g ∈ projectiveLines K U} ≃
|
||
{W : Submodule K U // Module.finrank K W = 2} where
|
||
toFun g := ⟨Classical.choose g.2, (Classical.choose_spec g.2).1⟩
|
||
invFun W := ⟨{p | p.submodule ≤ W.1}, ⟨W.1, W.2, rfl⟩⟩
|
||
left_inv g := Subtype.ext (Classical.choose_spec g.2).2.symm
|
||
right_inv W := Subtype.ext (projLine_inj (Classical.choose_spec
|
||
(⟨W.1, W.2, rfl⟩ : {p : ℙ K U | p.submodule ≤ W.1} ∈ projectiveLines K U)).2).symm
|
||
|
||
@[simp]
|
||
theorem projLineEquiv_apply_coe {U : Type u} [AddCommGroup U] [Module K U]
|
||
(g : {g : Set (ℙ K U) // g ∈ projectiveLines K U}) :
|
||
((projLineEquiv U) g).1 = Classical.choose g.2 := rfl
|
||
|
||
@[simp]
|
||
theorem projLineEquiv_symm_coe {U : Type u} [AddCommGroup U] [Module K U]
|
||
(W : {W : Submodule K U // Module.finrank K W = 2}) :
|
||
((projLineEquiv U).symm W).1 = {p : ℙ K U | p.submodule ≤ W.1} := rfl
|
||
|
||
/-- The underlying subspace of the point `equivSubmodule p` is `p.submodule`. -/
|
||
theorem equivSubmodule_coe {U : Type u} [AddCommGroup U] [Module K U] (p : ℙ K U) :
|
||
((Projectivization.equivSubmodule K U) p).1 = p.submodule := rfl
|
||
|
||
/-- The point built from a one-dimensional subspace `S` has `S` as its subspace. -/
|
||
theorem equivSubmodule_symm_submodule {U : Type u} [AddCommGroup U] [Module K U]
|
||
(S : {H : Submodule K U // Module.finrank K H = 1}) :
|
||
((Projectivization.equivSubmodule K U).symm S).submodule = S.1 :=
|
||
Projectivization.submodule_mk'' S.1 S.2
|
||
|
||
variable (V : Type u) [AddCommGroup V] [Module K V] [FiniteDimensional K V]
|
||
|
||
/-- The dual-coannihilator bijection between the `m`-dimensional subspaces of `V*`
|
||
and the `n`-dimensional subspaces of `V`, whenever `m + n = dim V`. -/
|
||
noncomputable def coannEquiv (m n : ℕ) (hmn : m + n = Module.finrank K V) :
|
||
{Φ : Submodule K (Module.Dual K V) // Module.finrank K Φ = m} ≃
|
||
{S : Submodule K V // Module.finrank K S = n} where
|
||
toFun Φ := ⟨Φ.1.dualCoannihilator, by
|
||
have h2 := Subspace.finrank_add_finrank_dualCoannihilator_eq Φ.1
|
||
rw [Φ.2, ← hmn] at h2
|
||
exact Nat.add_left_cancel h2⟩
|
||
invFun S := ⟨S.1.dualAnnihilator, by
|
||
have h2 := Subspace.finrank_add_finrank_dualAnnihilator_eq S.1
|
||
rw [S.2, ← hmn, add_comm m n] at h2
|
||
exact Nat.add_left_cancel h2⟩
|
||
left_inv Φ := Subtype.ext Subspace.dualCoannihilator_dualAnnihilator_eq
|
||
right_inv S := Subtype.ext Subspace.dualAnnihilator_dualCoannihilator_eq
|
||
|
||
@[simp]
|
||
theorem coannEquiv_apply_coe (m n : ℕ) (hmn : m + n = Module.finrank K V)
|
||
(Φ : {Φ : Submodule K (Module.Dual K V) // Module.finrank K Φ = m}) :
|
||
((coannEquiv V m n hmn) Φ).1 = Φ.1.dualCoannihilator := rfl
|
||
|
||
variable {V}
|
||
|
||
/-- The dual-coannihilator is antitone and bijective on subspaces of `V*`. -/
|
||
theorem coann_le_iff {A B : Submodule K (Module.Dual K V)} :
|
||
B.dualCoannihilator ≤ A.dualCoannihilator ↔ A ≤ B := by
|
||
rw [← Subspace.dualAnnihilator_le_dualAnnihilator_iff,
|
||
Subspace.dualCoannihilator_dualAnnihilator_eq, Subspace.dualCoannihilator_dualAnnihilator_eq]
|
||
|
||
variable (V) in
|
||
/-- The point map of the duality: a point `⟨λ⟩` of `ℙ(V*)` maps to the projective
|
||
line of `ℙ(V)` consisting of the points whose direction annihilates `λ`. -/
|
||
noncomputable def dualityPoint (h : Module.finrank K V = 3) :
|
||
ℙ K (Module.Dual K V) ≃ {g : Set (ℙ K V) // g ∈ projectiveLines K V} :=
|
||
(Projectivization.equivSubmodule K (Module.Dual K V)).trans <|
|
||
(coannEquiv V 1 2 (by omega)).trans (projLineEquiv V).symm
|
||
|
||
variable (V) in
|
||
/-- The line map of the duality: a projective line of `ℙ(V*)` maps to the point of
|
||
`ℙ(V)` whose direction is the joint kernel. -/
|
||
noncomputable def dualityLine (h : Module.finrank K V = 3) :
|
||
{g : Set (ℙ K (Module.Dual K V)) // g ∈ projectiveLines K (Module.Dual K V)} ≃ ℙ K V :=
|
||
(projLineEquiv (Module.Dual K V)).trans <|
|
||
(coannEquiv V 2 1 (by omega)).trans (Projectivization.equivSubmodule K V).symm
|
||
|
||
/-- **Point-line duality.** For a three-dimensional vector space `V` over a field
|
||
`K`, the incidence structure of the projective plane `ℙ(V*)` is isomorphic to the
|
||
dual of the incidence structure of `ℙ(V)`. -/
|
||
theorem isomorphic_dual_projectivization (K V : Type u) [Field K] [AddCommGroup V]
|
||
[Module K V] (h : Module.finrank K V = 3) :
|
||
(toIncidenceStructure (projectivization K (Module.Dual K V))).Isomorphic
|
||
(toIncidenceStructure (projectivization K V)).Dual := by
|
||
haveI : FiniteDimensional K V := Module.finite_of_finrank_eq_succ h
|
||
refine ⟨dualityPoint V h, dualityLine V h, fun x g => ?_⟩
|
||
-- The incidence condition reduces to the antitonicity of `dualCoannihilator`.
|
||
change x ∈ g.1 ↔ (dualityLine V h g) ∈ (dualityPoint V h x).1
|
||
have hg : g.1 = {p : ℙ K (Module.Dual K V) | p.submodule ≤ Classical.choose g.2} :=
|
||
(Classical.choose_spec g.2).2
|
||
have hφ : (dualityPoint V h x).1 =
|
||
{p : ℙ K V | p.submodule ≤ (x.submodule).dualCoannihilator} := by
|
||
simp only [dualityPoint, Equiv.trans_apply, projLineEquiv_symm_coe, coannEquiv_apply_coe,
|
||
equivSubmodule_coe]
|
||
have hψ : (dualityLine V h g).submodule = (Classical.choose g.2).dualCoannihilator := by
|
||
simp only [dualityLine, Equiv.trans_apply, equivSubmodule_symm_submodule, coannEquiv_apply_coe,
|
||
projLineEquiv_apply_coe]
|
||
rw [hg, hφ]
|
||
simp only [Set.mem_setOf_eq]
|
||
rw [hψ]
|
||
exact coann_le_iff.symm
|
||
|
||
end Duality
|
||
|
||
end IncidenceGeometry
|