Documentation

Mathlib.Combinatorics.Configuration

Configurations of Points and lines #

This file introduces abstract configurations of points and lines, and proves some basic properties.

Main definitions #

Main statements #

def Configuration.Dual (P : Type u_1) :
Type u_1

A type synonym.

Equations
    Instances For
      Equations
        instance Configuration.instFintypeDual (P : Type u_1) [h : Fintype P] :
        Equations
          instance Configuration.instMembershipDual (P : Type u_1) (L : Type u_2) [Membership P L] :
          Equations
            class Configuration.Nondegenerate (P : Type u_1) (L : Type u_2) [Membership P L] :

            A configuration is nondegenerate if:

            1. there does not exist a line that passes through all of the points,
            2. there does not exist a point that is on all of the lines,
            3. there is at most one line through any two points,
            4. any two lines have at most one intersection point. Conditions 3 and 4 are equivalent.
            • exists_point (l : L) : ∃ (p : P), pl
            • exists_line (p : P) : ∃ (l : L), pl
            • eq_or_eq {p₁ p₂ : P} {l₁ l₂ : L} : p₁ l₁p₂ l₁p₁ l₂p₂ l₂p₁ = p₂ l₁ = l₂
            Instances
              class Configuration.HasPoints (P : Type u_1) (L : Type u_2) [Membership P L] extends Configuration.Nondegenerate P L :
              Type (max u_1 u_2)

              A nondegenerate configuration in which every pair of lines has an intersection point.

              • exists_point (l : L) : ∃ (p : P), pl
              • exists_line (p : P) : ∃ (l : L), pl
              • eq_or_eq {p₁ p₂ : P} {l₁ l₂ : L} : p₁ l₁p₂ l₁p₁ l₂p₂ l₂p₁ = p₂ l₁ = l₂
              • mkPoint {l₁ l₂ : L} : l₁ l₂P

                Intersection of two lines

              • mkPoint_ax {l₁ l₂ : L} (h : l₁ l₂) : mkPoint h l₁ mkPoint h l₂
              Instances
                class Configuration.HasLines (P : Type u_1) (L : Type u_2) [Membership P L] extends Configuration.Nondegenerate P L :
                Type (max u_1 u_2)

                A nondegenerate configuration in which every pair of points has a line through them.

                • exists_point (l : L) : ∃ (p : P), pl
                • exists_line (p : P) : ∃ (l : L), pl
                • eq_or_eq {p₁ p₂ : P} {l₁ l₂ : L} : p₁ l₁p₂ l₁p₁ l₂p₂ l₂p₁ = p₂ l₁ = l₂
                • mkLine {p₁ p₂ : P} : p₁ p₂L

                  Line through two points

                • mkLine_ax {p₁ p₂ : P} (h : p₁ p₂) : p₁ mkLine h p₂ mkLine h
                Instances
                  instance Configuration.Dual.hasLines (P : Type u_1) (L : Type u_2) [Membership P L] [HasPoints P L] :
                  Equations
                    instance Configuration.Dual.hasPoints (P : Type u_1) (L : Type u_2) [Membership P L] [HasLines P L] :
                    Equations
                      theorem Configuration.HasPoints.existsUnique_point (P : Type u_1) (L : Type u_2) [Membership P L] [HasPoints P L] (l₁ l₂ : L) (hl : l₁ l₂) :
                      ∃! p : P, p l₁ p l₂
                      theorem Configuration.HasLines.existsUnique_line (P : Type u_1) (L : Type u_2) [Membership P L] [HasLines P L] (p₁ p₂ : P) (hp : p₁ p₂) :
                      ∃! l : L, p₁ l p₂ l
                      theorem Configuration.Nondegenerate.exists_injective_of_card_le {P : Type u_1} {L : Type u_2} [Membership P L] [Nondegenerate P L] [Fintype P] [Fintype L] (h : Fintype.card L Fintype.card P) :
                      ∃ (f : LP), Function.Injective f ∀ (l : L), f ll

                      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.

                      noncomputable def Configuration.lineCount {P : Type u_1} (L : Type u_2) [Membership P L] (p : P) :

                      Number of points on a given line.

                      Equations
                        Instances For
                          noncomputable def Configuration.pointCount (P : Type u_1) {L : Type u_2} [Membership P L] (l : L) :

                          Number of lines through a given point.

                          Equations
                            Instances For
                              theorem Configuration.sum_lineCount_eq_sum_pointCount (P : Type u_1) (L : Type u_2) [Membership P L] [Fintype P] [Fintype L] :
                              p : P, lineCount L p = l : L, pointCount P l
                              theorem Configuration.HasLines.pointCount_le_lineCount {P : Type u_1} {L : Type u_2} [Membership P L] [HasLines P L] {p : P} {l : L} (h : pl) [Finite { l : L // p l }] :
                              theorem Configuration.HasPoints.lineCount_le_pointCount {P : Type u_1} {L : Type u_2} [Membership P L] [HasPoints P L] {p : P} {l : L} (h : pl) [hf : Finite { p : P // p l }] :

                              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|.

                              theorem Configuration.HasLines.exists_bijective_of_card_eq {P : Type u_1} {L : Type u_2} [Membership P L] [HasLines P L] [Fintype P] [Fintype L] (h : Fintype.card P = Fintype.card L) :
                              ∃ (f : LP), Function.Bijective f ∀ (l : L), pointCount P l = lineCount L (f l)
                              theorem Configuration.HasLines.lineCount_eq_pointCount {P : Type u_1} {L : Type u_2} [Membership P L] [HasLines P L] [Fintype P] [Fintype L] (hPL : Fintype.card P = Fintype.card L) {p : P} {l : L} (hpl : pl) :
                              theorem Configuration.HasPoints.lineCount_eq_pointCount {P : Type u_1} {L : Type u_2} [Membership P L] [HasPoints P L] [Fintype P] [Fintype L] (hPL : Fintype.card P = Fintype.card L) {p : P} {l : L} (hpl : pl) :
                              noncomputable def Configuration.HasLines.hasPoints {P : Type u_1} {L : Type u_2} [Membership P L] [HasLines P L] [Fintype P] [Fintype L] (h : Fintype.card P = Fintype.card L) :

                              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
                                Instances For
                                  noncomputable def Configuration.HasPoints.hasLines {P : Type u_1} {L : Type u_2} [Membership P L] [HasPoints P L] [Fintype P] [Fintype L] (h : Fintype.card P = Fintype.card L) :

                                  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
                                    Instances For
                                      class Configuration.ProjectivePlane (P : Type u_1) (L : Type u_2) [Membership P L] extends Configuration.HasPoints P L, Configuration.HasLines P L :
                                      Type (max u_1 u_2)

                                      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.

                                      Instances
                                        noncomputable def Configuration.ProjectivePlane.order (P : Type u_1) (L : Type u_2) [Membership P L] [ProjectivePlane P L] :

                                        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
                                            theorem Configuration.ProjectivePlane.lineCount_eq {P : Type u_1} (L : Type u_2) [Membership P L] [ProjectivePlane P L] [Finite P] [Finite L] (p : P) :
                                            lineCount L p = order P L + 1
                                            theorem Configuration.ProjectivePlane.pointCount_eq (P : Type u_1) {L : Type u_2} [Membership P L] [ProjectivePlane P L] [Finite P] [Finite L] (l : L) :
                                            pointCount P l = order P L + 1
                                            theorem Configuration.ofField.mem_iff {K : Type u_3} [Field K] (v w : Projectivization K (Fin 3K)) :
                                            theorem Configuration.ofField.crossProduct_eq_zero_of_dotProduct_eq_zero {K : Type u_3} [Field K] {a b c d : Fin 3K} (hac : a ⬝ᵥ c = 0) (hbc : b ⬝ᵥ c = 0) (had : a ⬝ᵥ d = 0) (hbd : b ⬝ᵥ d = 0) :
                                            (crossProduct a) b = 0 (crossProduct c) d = 0
                                            theorem Configuration.ofField.eq_or_eq_of_orthogonal {K : Type u_3} [Field K] {a b c d : Projectivization K (Fin 3K)} (hac : a.orthogonal c) (hbc : b.orthogonal c) (had : a.orthogonal d) (hbd : b.orthogonal d) :
                                            a = b c = d