Files
elementarGeometrie/ElementarGeometrie/Projective/Duality.lean
Stefan Kebekus 149ad082a3
Some checks failed
Lean Action CI / build (push) Has been cancelled
Update Duality.lean
2026-06-24 14:02:15 +02:00

207 lines
9.4 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.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 : (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 : (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, ]
simp only [Set.mem_setOf_eq]
rw []
exact coann_le_iff.symm
end Duality
end IncidenceGeometry