Configurations of Points and lines #
This file introduces abstract configurations of points and lines, and proves some basic properties.
Main definitions #
Configuration.Nondegenerate
: Excludes certain degenerate configurations, and imposes uniqueness of intersection points.Configuration.HasPoints
: A nondegenerate configuration in which every pair of lines has an intersection point.Configuration.HasLines
: A nondegenerate configuration in which every pair of points has a line through them.Configuration.lineCount
: The number of lines through a given point.Configuration.pointCount
: The number of lines through a given line.
Main statements #
Configuration.HasLines.card_le
:HasLines
implies|P| ≤ |L|
.Configuration.HasPoints.card_le
:HasPoints
implies|L| ≤ |P|
.Configuration.HasLines.hasPoints
:HasLines
and|P| = |L|
impliesHasPoints
.Configuration.HasPoints.hasLines
:HasPoints
and|P| = |L|
impliesHasLines
. Together, these four statements say that any two of the following properties imply the third: (a)HasLines
, (b)HasPoints
, (c)|P| = |L|
.
Equations
Equations
Equations
- Configuration.instMembershipDual P L = { mem := Function.swap Membership.mem }
A configuration is nondegenerate if:
- there does not exist a line that passes through all of the points,
- there does not exist a point that is on all of the lines,
- there is at most one line through any two points,
- any two lines have at most one intersection point. Conditions 3 and 4 are equivalent.
- exists_point (l : L) : ∃ (p : P), p ∉ l
- exists_line (p : P) : ∃ (l : L), p ∉ l
Instances
A nondegenerate configuration in which every pair of lines has an intersection point.
- mkPoint {l₁ l₂ : L} : l₁ ≠ l₂ → P
- mkPoint_ax {l₁ l₂ : L} (h : l₁ ≠ l₂) : Configuration.HasPoints.mkPoint h ∈ l₁ ∧ Configuration.HasPoints.mkPoint h ∈ l₂
Instances
A nondegenerate configuration in which every pair of points has a line through them.
- mkLine {p₁ p₂ : P} : p₁ ≠ p₂ → L
- mkLine_ax {p₁ p₂ : P} (h : p₁ ≠ p₂) : p₁ ∈ Configuration.HasLines.mkLine h ∧ p₂ ∈ Configuration.HasLines.mkLine h
Instances
Equations
- Configuration.Dual.hasLines P L = Configuration.HasLines.mk (@Configuration.HasPoints.mkPoint P L inst✝¹ inst✝) ⋯
Equations
- Configuration.Dual.hasPoints P L = Configuration.HasPoints.mk (@Configuration.HasLines.mkLine P L inst✝¹ inst✝) ⋯
If a nondegenerate configuration has at least as many points as lines, then there exists
an injective function f
from lines to points, such that f l
does not lie on l
.
Number of points on a given line.
Equations
- Configuration.lineCount L p = Nat.card { l : L // p ∈ l }
Instances For
Number of lines through a given point.
Equations
- Configuration.pointCount P l = Nat.card { p : P // p ∈ l }
Instances For
If a nondegenerate configuration has a unique line through any two points, then |P| ≤ |L|
.
If a nondegenerate configuration has a unique point on any two lines, then |L| ≤ |P|
.
If a nondegenerate configuration has a unique line through any two points, and if |P| = |L|
,
then there is a unique point on any two lines.
Equations
- Configuration.HasLines.hasPoints h = Configuration.HasPoints.mk (fun {l₁ l₂ : L} (hl : l₁ ≠ l₂) => Classical.choose ⋯) ⋯
Instances For
If a nondegenerate configuration has a unique point on any two lines, and if |P| = |L|
,
then there is a unique line through any two points.
Equations
- Configuration.HasPoints.hasLines h = Configuration.HasLines.mk (fun (x x_1 : P) => Configuration.HasPoints.mkPoint) ⋯
Instances For
A projective plane is a nondegenerate configuration in which every pair of lines has an intersection point, every pair of points has a line through them, and which has three points in general position.
- mkPoint_ax {l₁ l₂ : L} (h : l₁ ≠ l₂) : Configuration.HasPoints.mkPoint h ∈ l₁ ∧ Configuration.HasPoints.mkPoint h ∈ l₂
- mkLine_ax {p₁ p₂ : P} (h : p₁ ≠ p₂) : p₁ ∈ Configuration.ProjectivePlane.mkLine h ∧ p₂ ∈ Configuration.ProjectivePlane.mkLine h
Instances
Equations
- One or more equations did not get rendered due to their size.
The order of a projective plane is one less than the number of lines through an arbitrary point. Equivalently, it is one less than the number of points on an arbitrary line.
Equations
Instances For
Equations
- Configuration.ofField.instMembershipProjectivizationForallFinOfNatNat = { mem := Function.swap Projectivization.orthogonal }
Equations
- Configuration.ofField.instProjectivePlaneProjectivizationForallFinOfNatNatOfDecidableEq = Configuration.ProjectivePlane.mk (fun {v w : Projectivization K (Fin 3 → K)} (a : v ≠ w) => v.cross w) ⋯ ⋯